在后台运行命令

3 投票
3 回答
5912 浏览
提问于 2025-04-16 00:19

我正在使用Python的subprocess模块来运行一些命令,并在后台存储它们的输出。这些命令是在我的机器上执行的。每当我从命令行运行这些命令时,它们都能正常工作。但是,当我尝试使用subprocess模块运行相同的命令时,却出现了以下错误。

要执行的命令是 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

试着把它改成 ['vxswadm', 'listswitch', 'all', '>', 'tmp.txt','&'],或者把 shell 改成 False

我觉得可能是 shell 的设置问题,如果这样能解决的话。

你也可以试着加上 stdin=subprocess.PIPE, stdout=subprocess.PIPE,不过我不太相信这会有影响。

2

在使用 os.getlogin() 和 subprocess 还有 Python 的时候,会遇到一些问题。

你可以看看这个链接了解更多:http://code.activestate.com/lists/python-list/288845/

你需要用其他的方法,比如:

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

另外,你也可以查看这个链接,了解如何以一种更通用的方式获取用户名:讨论关于获取当前用户名的通用方法

2

这个问题可能是因为bash这个命令行工具在遇到&后立刻结束了,导致它给所有子进程发送了一个叫做SIGHUP的信号(这是标准的shell行为)。

你可以使用一个叫做子进程模块的工具,直接执行命令,并且可以自己把输出重定向到tmp.txt文件。方法是先打开这个文件,然后把文件的句柄传给Popen调用中的stdout参数。

撰写回答