在后台运行命令

时间:2010-06-23 10:19:58

标签: python django

我正在使用python子进程模块来运行一些命令并将其输出存储在后台。该命令部署在我的机器上。现在每当我从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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

os.getlogin()和子处理以及python存在问题。 见http://code.activestate.com/lists/python-list/288845/

您需要使用其他内容,例如:

pwd.getpwuid(os.getuid()).pw_name(仅限Unix)

另请参阅discussion on a portable way to get the username

答案 2 :(得分:0)

尝试将其更改为['vxswadm', 'listswitch', 'all', '>', 'tmp.txt','&']和/或将shell更改为False

我认为它可能是shell位,但是(如果修复了它)。

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