2010-06-23 162 views
2

我正在使用python subprocess模块​​来运行一些命令并将其输出存储在后台。该命令部署在我的机器上。现在,每当我从shell提示符运行命令,它工作正常。但是,当我尝试使用子模块运行相同的命令,它提供了以下错误在后台运行命令

要执行的命令是vxswadm listswitch all

process = subprocess.Popen('vxswadm listswitch all > tmp.txt &',shell=True)   
>>> Traceback (most recent call last): 
    File "/usr/bin/vxswadm", line 30, in <module> 
    l.uname = os.getlogin() 
    OSError: [Errno 25] Inappropriate ioctl for device 

谁能帮我解决这个错误。任何建议都会有所帮助。在此先感谢

Tazim

+0

它可能是您处理stdout的方式,或者是stdout本身出现的错误。你是否能够在python之外成功运行该命令? – 2010-06-23 10:33:26

+0

yes命令在shell提示符下正常工作 – tazim 2010-06-23 10:35:07

回答

0

尝试将其更改为['vxswadm', 'listswitch', 'all', '>', 'tmp.txt','&']和/或改变壳False。我认为这可能是壳位,但(如果修复了它)。

您也可以尝试添加stdin=subprocess.PIPE, stdout=subprocess.PIPE,但我怀疑这会影响它。

2

该问题可能是由于bash shell在&之后立即终止,并将SIGHUP信号发送给它的所有子进程(标准shell行为)。

您可以使用子流程模块直接执行该命令,并可以通过首先打开该文件并将文件句柄传递给Popen调用的参数stdout来将输出重定向到tmp.txt