我正在使用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
答案 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)
答案 2 :(得分:0)
尝试将其更改为['vxswadm', 'listswitch', 'all', '>', 'tmp.txt','&']
和/或将shell更改为False
。
我认为它可能是shell位,但是(如果修复了它)。
您也可以尝试添加stdin=subprocess.PIPE, stdout=subprocess.PIPE
,但我怀疑这会影响它。