【问题标题】:Popen and python弹出和蟒蛇
【发布时间】:2010-11-03 17:14:28
【问题描述】:

正在处理一些代码,当我从命令提示符运行它时出现错误...

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 中更改了一些模块
  • Python 2.5 说完... process = os.Popen(cmd, stderr=STDOUT, stdout=PIPE) 现在它给了我错误... NameError: name 'STDOUT' is not defined
  • 之后.. WindowsError: [错误3] 系统找不到指定的路径
  • 这不是 Python 问题。你的exepath存在吗?你需要问另一个问题才能得到这个错误的正确答案(它与你原来的问题无关),这个问题已经完成了。

标签: python popen


【解决方案1】:

你应该这样做:

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

【讨论】:

  • 之后.. WindowsError: [错误3] 系统找不到指定的路径
【解决方案2】:

Popen在子进程模块中定义

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

或者:

from subprocess import Popen
Popen(...)

【讨论】:

  • 从子流程导入Popen;弹出(...)
  • 在说之后... process = os.Popen(cmd, stderr=STDOUT, stdout=PIPE) 它现​​在给了我错误... NameError: name 'STDOUT' is not defined
  • process = subprocess.Popen(cmd,stderr=subprocess.STDOUT,stdout=subprocess.PIPE)
【解决方案3】:

当您导入一个模块时,该模块的成员不会成为全局命名空间的一部分:您仍然需要为它们添加前缀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)

【讨论】:

    【解决方案4】:

    这看起来像来自子进程模块的 Popen (python >= 2.4)

    from subprocess import Popen
    

    【讨论】:

      【解决方案5】:

      如果您的导入如下所示:

      import os
      

      那么你需要像这样引用os中包含的东西:

      os.popen()
      

      如果您不想这样做,可以将导入更改为如下所示:

      from os import *
      

      不建议这样做,因为它会导致命名空间模糊(代码中的内容与其他地方导入的内容冲突。)您也可以这样做:

      from os import popen
      

      这比 from os import * 更明确、更容易阅读

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 如果这有助于澄清任何事情,我还导入了子流程
        • 你调用的是 "Popen()" 而实际上你应该使用 "os.popen()"
        猜你喜欢
        • 1970-01-01
        • 2019-01-08
        • 2017-08-30
        • 2011-06-07
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        • 1970-01-01
        • 2016-01-09
        相关资源
        最近更新 更多