python超时使用os.system

Posted

技术标签:

【中文标题】python超时使用os.system【英文标题】:python timeout using os.system 【发布时间】:2013-07-25 23:09:18 【问题描述】:

所以,我知道每个人都会告诉我使用 subprocess 模块,但我不能将它用于我正在处理的项目,因为 Piping 根本不想在我的系统上使用 wxpython 和 py2exe。

所以,我一直在使用 os.system 调用。我需要知道如何等待该过程结束。 目前,我有

os.system(cmd)

而且我的命令实际上可能需要很长时间才能执行,所以它通常会提前超时。 如何让我的程序等待 os.system?我试过 waitpid,我猜这对 os.system 不起作用。

我正在为 Windows 开发,所以很遗憾我不能使用 fork 和 execvp。我有很多手被束缚:(

【问题讨论】:

os.system 永远不会超时,并且在进程完成之前不应返回。也许你的命令超时了? 相关:subprocess with timeout 【参考方案1】:

在another post回答了类似的问题。

重点是:

使用subprocess.check_output 代替os.system,因为subprocess.check_output 支持timeout

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, 超时=None, text=None, **other_popen_kwargs)

【讨论】:

【参考方案2】:

您可以更正您的代码:

os.system('cmd')

关于子流程的补充说明:

import subprocess
ls_output = subprocess.check_output(['ls'])

运行外部命令

要运行外部命令而不与它交互,例如使用os.system(),请使用call() 函数。

import subprocess

# Simple command
subprocess.call('ls -l', shell=True)

$ python replace_os_system.py
total 16
-rw-r--r--   1 root8085  root8085     0 Jul  1 13:27 __init__.py
-rw-r--r--   1 root8085  root8085  1316 Jul  1 13:27 replace_os_system.py
-rw-r--r--   1 root8085  root8085  1167 Jul  1 13:27 replace_os_system.py~

# run cmd

import subprocess
l = subprocess.call(['cmd'])

额外的例子: 以三种不同的方式进行系统调用:

#! /usr/bin/env python
import subprocess
# Use a sequence of args
return_code = subprocess.call(["echo", "hello sequence"])

# Set shell=true so we can use a simple string for the command
return_code = subprocess.call("echo hello string", shell=True)

# subprocess.call() is equivalent to using subprocess.Popen() and wait()
proc = subprocess.Popen("echo hello popen", shell=True)
return_code = proc.wait() # wait for process to finish so we can get the return code

控制标准错误和标准输出:

#! /usr/bin/env python
import subprocess
# Put stderr and stdout into pipes
proc = subprocess.Popen("echo hello stdout; echo hello stderr >&2", \
        shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
return_code = proc.wait()
# Read from pipes
for line in proc.stdout:
    print("stdout: " + line.rstrip())
for line in proc.stderr:
    print("stderr: " + line.rstrip())

【讨论】:

以上是关于python超时使用os.system的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中运行一些超时代码的正确方法

Python:使用for循环插入数据而没有超时错误

如何在 python 的 socket recv 方法上设置超时?

如何使用 python 2.7.6 使 subprocess.call 超时?

使用Python中的信号超时

使用pip安装Python库超时解决办法