سؤال

هل هناك طريقة للقيام بمكالمات متعددة في نفس "الجلسة" بالبوباء؟ على سبيل المثال، هل يمكنني إجراء مكالمة من خلالها ثم واحدة أخرى بعد ذلك دون الحاجة إلى تسلسل الأوامر إلى سلسلة طويلة؟

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

المحلول

أنت لا "إجراء مكالمة" عند استخدام Popen، فأنت تقوم بتشغيل قابل للتنفيذ والتحدث معه عبر Stdin و Stdout و Stderr. إذا كان الملف القابل للتنفيذ لديه طريقة للقيام ب "جلسة" للعمل (على سبيل المثال، عن طريق قراءة خطوط Stdin)، فعندئذ نعم، يمكنك القيام بذلك. خلاف ذلك، ستحتاج إلى EXEC مرات متعددة.

subprocess.popen هو (في الغالب) مجرد التفاف حول execvp (3)

نصائح أخرى

على افتراض أنك تريد أن تكون قادرا على تشغيل قذيفة وإرسالها بأوامر متعددة (وقراءة إخراجها)، فسيظهر لك أن تفعل شيئا مثل هذا:

from subprocess import *
p = Popen(['/bin/sh'], shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE)

بعد ذلك، على سبيل المثال،:

>>> p.stdin.write("cat /etc/motd\n")
>>> p.stdout.readline()
'Welcome to dev-linux.mongo.com.\n'

(بالطبع، يجب عليك التحقق stderr أيضا، أو اي اسأل Popen لدمجها مع stdout). رئيس واحد مشكلة مع ما سبق هو أن stdin و stdout الأنابيب في وضع الحظر، لذلك من السهل الحصول على "عالق" في انتظار الإخراج من القذيفة. على الرغم من أنني لم أحاول ذلك، هناك وصفة في موقع Abrestate الذي يوضح كيفية معالجة هذا.

تحديث: بعد النظر في الأسئلة / الإجابات ذات الصلة، يبدو أنه قد يكون أبسط استخدام فقط select الوحدة النمطية لمعرفة ما إذا كانت هناك بيانات لقراءة stdout (يجب عليك أيضا أن تفعل الشيء نفسه stderr, بالطبع)، على سبيل المثال:

>>> select.select([p.stdout], [], [], 0)
([<open file '<fdopen>', mode 'rb' at 0x10341690>], [], [])

على سبيل المثال، هل يمكنني إجراء مكالمة من خلالها ثم واحدة أخرى بعد ذلك دون الحاجة إلى تسلسل الأوامر إلى سلسلة طويلة؟

يبدو أنك تستخدم شل = صحيح. لا، إلا إذا كنت بحاجة إلى. بدلا من ذلك استخدام Shell = False (الافتراضي) وتمرير في قائمة الأوامر / Arg.

هل هناك طريقة للقيام بمكالمات متعددة في نفس "الجلسة" بالبوباء؟ على سبيل المثال، هل يمكنني إجراء مكالمة من خلالها ثم واحدة أخرى بعد ذلك دون الحاجة إلى تسلسل الأوامر إلى سلسلة طويلة؟

أي سبب لا يمكنك فقط إنشاء مثيلتين منبثتين وانتظر / التواصل معه حسب الضرورة؟ هذه هي الطريقة العادية للقيام بذلك، إذا فهمت لك بشكل صحيح.

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