运行Popen时出错

时间:2014-05-23 20:28:19

标签: python

尝试使用Popen运行命令时遇到以下错误,这里有什么问题?

cmd = "export COMMANDER_SERVER=commander.company.com"
Pipe = Popen(cmd, stdout=PIPE, stderr=PIPE)
(output, error) = Pipe.communicate()

错误: -

Traceback (most recent call last):
  File "test_ectool.py", line 26, in <module>
    main()
  File "test_ectool.py", line 13, in main
    Pipe = Popen(cmd, stdout=PIPE, stderr=PIPE)
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

2 个答案:

答案 0 :(得分:2)

  1. 您需要将参数与命令分开,并向Popen提供list
  2. 正如Kenster的评论所说,即使您的命令有效,您也只能成功修改子shell内的环境变量而不是主shell。
  3. 您将无法以这种方式运行export,因为它不是程序。这是一个内置的bash。
  4. 以下是使用正确语义的命令的示例。

    from subprocess import Popen,PIPE
    
    cmd = "echo COMMANDER_SERVER=commander.company.com"
    Pipe = Popen(cmd.split(), stdout=PIPE, stderr=PIPE)
    (output, error) = Pipe.communicate()
    print output
    

答案 1 :(得分:0)

关于Popen的命令字符串(点#1),merlin2011的回答是不正确的。来自Python docs

  

args 应该是一系列程序参数,或者是一个字符串。

正如其他人所说,环境变量将不会被保存。为此,您需要使用os.environ['VARNAME'] = value。如果您想使用其他bash内置函数,则必须将shell=True作为参数传递给Popen