تفرخ subprocess أن تتوقع وحدة الإدخال دون الحجب ؟

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

  •  21-08-2019
  •  | 
  •  

سؤال

أنا أحاول أن أفعل CVS الدخول من الثعبان عن طريق الاتصال cvs.exe العملية.عند الاتصال cvs.exe من جهة ، فإنه يطبع رسالة إلى وحدة التحكم ثم ينتظر من المستخدم إدخال كلمة المرور.

عند الاتصال مع subprocess.Popen, لقد لاحظت أن ندعو الكتل.رمز

subprocess.Popen(cvscmd, shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE,
    stderr = subprocess.PIPE)

أفترض أنه كتل لأنه في انتظار الإدخال ، ولكن كان توقعي أن يدعو Popen سيعود فورا ومن ثم يمكن أن أسميه subprocess.التواصل() إدخال كلمة المرور الفعلية.كيف يمكنني تحقيق هذا السلوك وتجنب حظر على Popen?

نظام التشغيل:ويندوز XP
بايثون:2.6
cvs.exe:1.11

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

المحلول

  • إزالة shell=True جزء.Shell الخاص بك أن تفعل شيئا مع ذلك.باستخدام shell=True هو سبب شائع من المتاعب.
  • استخدام قائمة من المعلمات cmd.

على سبيل المثال:

cmd = ['cvs', 
       '-d:pserver:anonymous@bayonne.cvs.sourceforge.net:/cvsroot/bayonne', 
       'login']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

هذا لن كتلة على نظام بلدي (بلدي النصي تواصل تنفيذ).ومع ذلك منذ cvs يقرأ كلمة المرور مباشرة من محطة (ليس من مستوى الإدخال أو الإخراج) لك لا يمكن فقط أكتب كلمة السر subprocess' stdin.

ما يمكنك فعله هو تمرير كلمة المرور كجزء من CVSROOT مواصفات بدلا من ذلك, مثل هذا:

:pserver:<user>[:<passwd>]@<server>:/<path>

أولا-هاء.وظيفة تسجيل الدخول إلى سورس المشروع:

import subprocess

def login_to_sourceforge_cvs(project, username='anonymous', password=''):
    host = '%s.cvs.sourceforge.net' % project
    path = '/cvsroot/%s' % project
    cmd = ['cvs', 
           '-d:pserver:%s:%s@%s:%s' % (username, password, host, path), 
           'login']
    p = subprocess.Popen(cmd, stdin=subprocess.PIPE, 
                              stdout=subprocess.PIPE
                              stderr=subprocess.STDOUT) 
    return p

هذا يعمل بالنسبة لي.الدعوة

login_to_sourceforge_cvs('bayonne')

الدخول في مجهول بايون المشروع cvs.

نصائح أخرى

إذا كنت أتمتة البرامج الخارجية التي تحتاج إلى مدخلات - مثل كلمة - أفضل رهان ربما يكون استخدام pexpect .

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