المناولة خطوط مع اقتباسات باستخدام قائد بيثون

StackOverflow https://stackoverflow.com/questions/1245907

  •  12-09-2019
  •  | 
  •  

سؤال

لقد كتبت برنامجا بسيطا يشبه القشرة يستخدم Readline من أجل توفير إكمال ذكي من الحجج. أرغب في دعم الوسائط التي لها مسافات ونقلها للدلالة كحجة واحدة (كما هو الحال مع توفير قذيفة مع هذه).

لقد رأيت أن Shlex.Split () يعرف كيفية تحليل الحجج المعروضة، ولكن في حالة حدوث مستخدم يريد إكمال منتصف الكتابة، فشل (على سبيل المثال: "إكمال" Hello "سيؤدي إلى إلقاء استثناء عند مروره إلى Shlex ، بسبب اقتباسات غير متوازنة).

هل هناك رمز للقيام بذلك؟

شكرا!

هل كانت مفيدة؟

المحلول

لا أعرف أي رمز موجود للمهمة، ولكن إذا كنت أقوم بذلك، فسأخذ الاستثناء، فحاول إضافة اقتباس زائدة وهمية، ومعرفة كيفية تعديل Shlex.Split مع السلسلة وبالتالي تعديلها.

نصائح أخرى

GNU Readline يسمح لهذا السيناريو مع المتغير rl_completer_quote_characters. وبعد لسوء الحظ، لا تصدير بيثون هذا الخيار على المكتبة القياسية readline الوحدة النمطية (حتى في 3.7.1، الأحدث اعتبارا من هذه الكتابة).

لقد وجدت وسيلة للقيام بذلك مع ctypes, ، على أية حال:

import ctypes

libreadline = ctypes.CDLL ("libreadline.so.6")
rl_completer_quote_characters = ctypes.c_char_p.in_dll (
    libreadline, 
    "rl_completer_quote_characters"
)
rl_completer_quote_characters.value = '"'

ملاحظة أنه من الواضح أن هذا غير محمول (ربما حتى بين توزيعة Linux، حيث أن إصدار LibleAdline Hardcoded، لكنني لم يكن لدي عادي libreadline.so على جهاز الكمبيوتر الخاص بي)، لذلك قد تضطر إلى تكييفها من أجل بيئتك.

أيضا، في حالتي، قمت بتعيين اقتباسات مزدوجة فقط باعتبارها خاصة ميزة الإنجاز، كما كانت حالة استخدام بلدي.

مراجع

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top