【问题标题】:python timeout using os.systempython超时使用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 永远不会超时,并且在进程完成之前不应返回。也许你的命令超时了?

标签: python python-2.7 subprocess os.system


【解决方案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())
    

    【讨论】:

      猜你喜欢
      • 2016-10-03
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 2017-11-29
      • 2013-01-17
      • 1970-01-01
      相关资源
      最近更新 更多