سؤال
والعمل على بعض الرموز وأنا نظرا للخطأ عند تشغيله من موجه الأوامر ...
NameError: name 'Popen' is not defined
ولكن لقد المستوردة على حد سواء import os
وimport sys
.
وهنا جزء من قانون
exepath = os.path.join(EXE File location is here)
exepath = '"' + os.path.normpath(exepath) + '"'
cmd = [exepath, '-el', str(el), '-n', str(z)]
print 'The python program is running this command:'
print cmd
process = Popen(cmd, stderr=STDOUT, stdout=PIPE)
outputstring = process.communicate()[0]
وأنا شيء مفقود الابتدائية؟ وأود أن لا أشك في ذلك. شكرا!
المحلول
ويجب ان تفعل:
import subprocess
subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
# etc.
نصائح أخرى
ويعرف Popen في وحدة فرعي أو جانبي
import subprocess
...
subprocess.Popen(...)
وأو:
from subprocess import Popen
Popen(...)
وعند استيراد وحدة نمطية، وأعضاء وحدة لا تصبح جزءا من مساحة الاسم العالمي: لا يزال لديك بادئة لهم modulename.
. لذلك، لديك لتقوله
import os
process = os.popen(command, mode, bufsize)
وبدلا من ذلك، يمكنك استخدام بناء الجملة from module import names
لاستيراد أشياء في مساحة الاسم العالمي:
from os import popen # Or, from os import * to import everything
process = popen(command, mode, bufsize)
وهذا يبدو وكأنه Popen من وحدة فرعي أو جانبي (الثعبان> = 2.4)
from subprocess import Popen
إذا يبدو الاستيراد الخاصة بك مثل هذا:
import os
وبعد ذلك تحتاج إلى مرجع الأمور المدرجة في نظام التشغيل مثل هذا:
os.popen()
إذا كنت لا تريد أن تفعل ذلك، يمكنك تغيير الاستيراد الخاص بك لتبدو مثل هذا:
from os import *
والتي لا ينصح لأنه يمكن أن يؤدي إلى الغموض مساحة الاسم (على الامور في التعليمات البرمجية يتعارض مع الأشياء المستوردة في مكان آخر) يمكنك أيضا أن مجرد القيام به:
from os import popen
وأيهما أكثر وضوحا وأسهل في القراءة من نظام التشغيل من استيراد *
ويجب أن تكون باستخدام os.popen () إذا كنت ببساطة استيراد نظام التشغيل.