سؤال

أواجه حاليًا مشكلة كبيرة مع البرنامج النصي بيثون.يقوم البرنامج النصي بتشغيل أوامر عشوائية من خلال معالج لتحويل تقرير الخطأ غير الصحيح إلى تقرير خطأ صحيح.

المشكلة التي أواجهها هي جعل البرنامج النصي يعمل بشكل صحيح على النوافذ باستخدام أمر يحتوي على علامات العطف في مساره.لقد حاولت اقتباس الأمر، والهروب من علامة الضم بـ ^ ولم ينجح أي منهما.أنا الآن خارج الأفكار.أي اقتراحات؟

للتوضيح من الردود الحالية:

  1. أنا أستخدم وحدة العملية الفرعية
  2. أقوم بتمرير سطر الأوامر + الوسائط كقائمة
  3. تكمن المشكلة في المسار إلى الأمر نفسه، وليس في أي من الوسائط
  4. لقد حاولت اقتباس الأمر.يسبب أ [Error 123] The filename, directory name, or volume label syntax is incorrect خطأ
  5. أنا لا أستخدم وسيطة Shell (لذا shell=false)
  6. في حال كان الأمر مهمًا، فأنا أقوم بإمساك أنبوب لمعالجته، ولكن أتجاهل stdout وstdin
  7. إنه مخصص للاستخدام حاليًا على نظام التشغيل Windows فقط، ويعمل كما هو متوقع في جميع الحالات الأخرى التي اختبرتها حتى الآن.
  8. الأمر الذي فشل هو:

p = subprocess.Popen(prog, stderr = subprocess.PIPE, bufsize=-1)

عندما يحتوي العنصر الأول من القائمة "prog" على أي علامات عطف.نقلا عن هذه السلسلة الأولى لا يعمل.

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

المحلول

تأكد من أنك تستخدم القوائم وليس توسيع الصدفة:

subprocess.Popen(['command', 'argument1', 'argument2'], shell=False)

نصائح أخرى

سوف تحتاج الإجابة الصحيحة إلى معلومات أكثر من ذلك.ماذا تفعل في الواقع؟كيف تفشل؟هل تستخدم وحدة العملية الفرعية؟هل تقوم بتمرير قائمة الوسائط وshell=False (أو لا توجد وسيطة Shell) أم أنك تستدعي الصدفة بالفعل؟

حاول اقتباس الوسيطة التي تحتوي على &

wget "http://foo.com/?bar=baz&baz=bar"

هذا عادة ما يجب القيام به في غلاف Linux

"الهروب من علامة الضم مع ^"

هل أنت متأكد ^ هل هي شخصية هروب لنظام التشغيل Windows؟ألا يجب أن تستخدم \?

للإجابة على سؤالي:

اقتباس الأمر الفعلي عند تمرير المعلمات كقائمة لا يعمل بشكل صحيح (الأمر هو العنصر الأول في القائمة) لذا لحل المشكلة قمت بتحويل القائمة إلى سلسلة مفصولة بمسافات وتمرير ذلك إلى عملية فرعية بدلاً من ذلك.

ولا تزال الحلول الأفضل محل ترحيب.

أحاول الوضع على النحو التالي:

exe = 'C:/Program Files (x86)/VideoLAN/VLC/VLC.exe'
url = 'http://translate.google.com/translate_tts?tl=en&q=hello+world'
subprocess.Popen([exe, url.replace("&","^&")],shell=True)

هذا يعمل.

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