Popen 和 Python

10

我在编写代码时,从命令提示符运行代码时出现以下错误...

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]

我是否漏掉了一些基本的东西?我不会怀疑的。谢谢!


指定Python版本。在Python-2.6中有一些模块已更改。 - van
1
Python 2.5在执行以下代码后... process = os.Popen(cmd, stderr=STDOUT, stdout=PIPE) 现在出现了错误...NameError: name 'STDOUT' is not defined - Tyler
之后出现了WindowsError: [Error 3] 系统找不到指定的路径。 - Tyler
这不是Python的问题。你的exepath存在吗?你需要问另一个问题以获得针对此错误的正确答案(与你最初的问题无关),此问题已经结束了。 - SilentGhost
6个回答

38

你应该这样做:

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

之后...Windows错误:[错误3]系统找不到指定的路径 - Tyler

7

Popen在subprocess模块中定义。

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

或者:

from subprocess import Popen
Popen(...)

from subprocess import Popen; Popen(...) - van
在执行以下代码时...process = os.Popen(cmd, stderr=STDOUT, stdout=PIPE)现在出现了错误...NameError: name 'STDOUT' is not defined - Tyler
process = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE) - Jay Atkinson

2
当你导入一个模块时,该模块的成员不会成为全局命名空间的一部分:你仍然需要在它们前面加上 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
如果你的导入看起来像这样:
import os

然后你需要像这样引用 os 中包含的内容:

os.popen()

如果你不想这样做,你可以将你的导入更改为以下形式:

from os import *

这种做法并不推荐,因为它可能会导致命名空间的歧义(你代码中的内容与其他地方导入的内容发生冲突)。你也可以这样做:

from os import popen

相较于从 os import *,哪种方式更加明确易读?


1

这看起来像是subprocess模块中的Popen(Python >= 2.4)

from subprocess import Popen

-2

如果你只是导入os,那么你应该使用os.popen()。


我还导入了subprocess,如果有帮助的话,请说明一下。 - Tyler
你在调用“Popen()”时,实际上应该使用“os.popen()”。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接