Python Subprocess.popen يعيد نفس Stdout على الرغم من أنه لا ينبغي

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

سؤال

أواجه مشكلة غريبة جدا مع Python Subprocess.popen. أنا أستخدمه للاتصال بعدة مرات خارجية خارجية والحفاظ على الإخراج في قائمة.

في كل مرة تسمونها هذا exe الخارجي، سيعود سلسلة مختلفة. وبعد ومع ذلك، إذا اتصلت به عدة مرات باستخدام Popen، فستكون دائما إرجاع نفس السلسلة. وبعد =: - س

يبدو أن البابا يعودون دائما نفس القيمة من Stdout، دون إذكاء إكس. ربما تفعل نوعا من التخزين المؤقت دون الاتصال مرة أخرى مرة أخرى exe.

هذا هو رمزي:

def get_key():

    from subprocess import Popen, PIPE

    args = [C_KEY_MAKER, '/26', USER_NAME, ENCRYPTION_TEMPLATE, '0', ]
    process = Popen(args, stdout=PIPE)
    output = process.communicate()[0].strip()
    return output

if __name__ == '__main__':
    print get_key() # Returns a certain string
    print get_key() # Should return another string, but returns the same!

ماذا على الأرض أنا أفعل الخطأ؟!

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

المحلول

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

نصائح أخرى

لا شيئ. هذا يعمل بشكل جيد، على اختباراتي (بصرف النظر عن خطأ المسافة البادئة في الأسفل). المشكلة إما في exe الخاص بك. أو في أي مكان آخر.

لتوضيح، قمت بإنشاء برنامج بيثون Tfile.py

cat > tfile.py
#!/usr/bin/env python
import random
print random.random()

ثم غير البرنامج للتخلص من مشكلة المسافة البادئة في الأسفل، والاتصال ب Tfile.py. انها تعطي اثنين من النتائج المختلفة.

لا أعرف ما الذي يحدث خطأ في مثالك، ولا يمكنني تكرار هذا السلوك، ولكن حاول أن جرب نهجا أكثر من كتاب الكتاب:

def get_key():

    from subprocess import Popen, PIPE

    args = [C_KEY_MAKER, '/26', USER_NAME, ENCRYPTION_TEMPLATE, '0', ]
    output = Popen(args, stdout=PIPE).stdout
    data = output.read().strip()
    output.close()
    return data

الكود الخاص بك غير قابل للتنفيذ كما هو من الصعب مساعدتك كثيرا. النظر في إصلاح المسافة البادئة وبناء جملة وجعلها مكتوبة ذاتيا، حتى نتمكن من تقديمها.

على لينكس، يبدو أنه يعمل بشكل جيد وفقا ل Devin Jeanpierre.

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