2009-06-17 72 views
5

工作的一些代碼,我從命令提示符下運行時,它給出的錯誤...POPEN和python

NameError: name 'Popen' is not defined 

,但我已經導入都import osimport 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] 

我思念的東西基本的組成部分?我不會懷疑它。謝謝!

+0

指定Python的版本。一些模塊在python-2.6 – van 2009-06-17 15:47:56

+1

的Python被改變2.5 說後... 過程= os.Popen(CMD,標準錯誤=標準輸出,標準輸出= PIPE) 現在給我的錯誤... NameError: name'STDOUT'is not defined – Tyler 2009-06-17 15:53:18

+0

@Tyler:重新閱讀我的答案 – SilentGhost 2009-06-17 16:03:06

回答

30

你應該做的:

import subprocess 
subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE) 
# etc. 
-1

如果你只是簡單地導入os,你應該使用os.popen()。

7

POPEN是子模塊

import subprocess 
... 
subprocess.Popen(...) 

或者定義:

from subprocess import Popen 
Popen(...) 
1

如果你的導入是這樣的:

import os 

然後,你需要引用包含在事物操作系統是這樣的:

os.popen() 

如果你不想這樣做,你可以改變你的進口看起來像這樣:不建議

from os import * 

這是因爲它可以導致命名空間歧義(東西在你的代碼用進口的東西發生衝突。其他地方)你也可以只做到:

from os import popen 

哪個更明確,更容易比從OS讀進口*

2

當導入模塊,TH e模塊的成員不會成爲全局命名空間的一部分:您仍然必須以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) 
1

這看起來像POPEN從子模塊(蟒蛇> = 2.4)

from subprocess import Popen