Python - عملية فرعية - كيفية استدعاء أمر Piped في Windows؟
-
20-08-2019 - |
سؤال
كيف يمكنني تشغيل هذا الأمر مع العملية الفرعية؟
حاولت:
proc = subprocess.Popen(
'''ECHO bosco|"C:\Program Files\GNU\GnuPG\gpg.exe" --batch --passphrase-fd 0 --output "c:\docume~1\usi\locals~1\temp\tmptlbxka.txt" --decrypt "test.txt.gpg"''',
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
stdout_value, stderr_value = proc.communicate()
ولكن حصلت على:
Traceback (most recent call last):
...
File "C:\Python24\lib\subprocess.py", line 542, in __init__
errread, errwrite)
File "C:\Python24\lib\subprocess.py", line 706, in _execute_child
startupinfo)
WindowsError: [Errno 2] The system cannot find the file specified
الأشياء التي لاحظتها:
- تشغيل الأمر على وحدة التحكم Windows يعمل بشكل جيد.
- إذا قمت بإزالة Echo Bosco | جزء ، فهو يعمل بشكل جيد المكالمة البوبن أعلاه.لذلك أعتقد أن هذه المشكلة مرتبطة بـ Echo أو |.
المحلول
أولاً وقبل كل شيء، أنت لا تحتاج فعليًا إلى أنبوب؛أنت فقط ترسل المدخلات.يمكنك استخدام عملية فرعية. التواصل من أجل هذا.
ثانيًا، لا تحدد الأمر كسلسلة؛هذا أمر فوضوي بمجرد تضمين أسماء الملفات ذات المسافات.
ثالثًا، إذا كنت تريد حقًا تنفيذ أمر عبر الأنابيب، فما عليك سوى الاتصال بـ Shell.على نظام التشغيل Windows، أعتقد أنه كذلك cmd /c program name arguments | further stuff
.
وأخيرًا، يمكن أن تكون الخطوط المائلة الخلفية المفردة خطيرة: "\p"
يكون '\\p'
, ، لكن '\n'
هو خط جديد.يستخدم نظام التشغيل.path.join() أو os.sep أو، إذا تم تحديده خارج بايثون، مجرد شرطة مائلة للأمام.
proc = subprocess.Popen(
['C:/Program Files/GNU/GnuPG/gpg.exe',
'--batch', '--passphrase-fd', '0',
'--output ', 'c:/docume~1/usi/locals~1/temp/tmptlbxka.txt',
'--decrypt', 'test.txt.gpg',],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
stdout_value, stderr_value = proc.communicate('bosco')
نصائح أخرى
لقد كنت على حق، مكتب المساعدات الإنسانية (ECHO) هو المشكلة.بدون الخيار shell=True، لا يمكن العثور على أمر ECHO.
فشل هذا بسبب الخطأ الذي رأيته:
subprocess.call(["ECHO", "Ni"])
يمر هذا:يطبع Ni و 0
subprocess.call(["ECHO", "Ni"], shell=True)