【问题标题】:How do I create a subprocess in Python?如何在 Python 中创建子进程?
【发布时间】:2011-05-28 03:48:28
【问题描述】:

我想创建一个进程的子进程。

什么是一个工作示例来说明如何实现这一点?

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    subprocess 文档开始。

    如果你想得到输出:

    >>> import subprocess
    >>> output = subprocess.Popen(['uname', '-a'], stdout=subprocess.PIPE).communicate()[0]
    >>> output
    'Linux'
    

    如果你只想调用而不处理输出:

    >>> subprocess.call(['echo', 'Hi'])
    Hi
    0
    

    subprocess.check_call 是一样的,只是它抛出一个CalledProcessError,以防使用无效参数调用命令。

    good subprocess tutorial

    【讨论】:

    • 是的,这就是我想要的。还有一个问题,当我将使用“output = subprocess.Popen(['uname', '-a'], stdout=subprocess.PIPE).communicate()[0]”这个命令时,它运行得很好......但是如果我必须像“rdiff-backup -v --force ”那样运行,那么如果我使用空格分割它们并将该列表应用于该命令会给我错误......所以我的问题是我必须通过空格分隔将我的命令写在列表中???
    • 您最好有一个列表作为Popen 的参数。如果您有一个字符串,请执行 string.split() 然后将其传递给Popen
    • 感谢 sukhbir,我已经完成了列表的拆分,但没有使用这个......这个输出也是完成执行时的输出......如何检索连续输出,而不是执行完成后输出?
    • communicate 方法的全部目的是等待进程完成并返回所有输出。如果您不想等待,请不要拨打communicate。相反,从 stdout 或 stderr 属性读取以读取输出。
    • 对不起,我是这个 python 的新手,所以问了很多问题,但是我们在命令中从 stdout 本身读取 - " subprocess >>> output = subprocess.Popen(['uname', '- a'], stdout=subprocess.PIPE).communicate()[0] "...那你能详细说明一下吗?
    【解决方案2】:

    启动和监控子流程:

    import subprocess, time, os, signal
    args=['/usr/bin/vmstat','-n','2']
    app=subprocess.Popen(args=args, stdout=open('somefile','w'))
    print "Your app's PID is %s. You can now process data..." % app.pid
    time.sleep(5)
    if app.poll() == None: print "Process is still running after 5s."
    print "The app outputed %s bytes." % len(open('somefile','r').read())
    print "Stopping the process..."
    os.kill(app.pid, signal.SIGTERM)
    

    还有更多。只需查看 Popen 文档即可。

    【讨论】:

      【解决方案3】:
      import subprocess
      
      subprocess.call(['echo', 'hello world'])
      

      【讨论】:

      • subprocess.call 是做什么的?我正在运行一个名为 test.py 的文件,我想运行它来创建子进程。这是否意味着我必须像 subprocess.call(['python', 'test.py']) 一样运行它?
      • 谢谢丹。我唯一不明白的是,如果我正在运行一个名为 test.py 的文件并且我想运行它来创建子进程。这是否意味着我必须像 subprocess.call(['python', 'test.py']) 一样运行它?
      • 为什么需要创建一个新的解释器而不是只使用 execfile? subprocess.call 是一个阻塞函数,如果您需要非阻塞操作,请使用 subprocess.Popen 代替。
      • 表示subprocess.Popen会创建一个新进程吗?
      【解决方案4】:

      如果你想运行一个简单的命令而不是提供一个单独的文件,这对我有用

      import subprocess
      process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
      process.wait()
      print process.returncode
      

      要获取进程的返回码,您可以使用process.returncode 要获得回复,您可以使用process.communicate()

      如果您感到困惑,您可以使用 command="ls" 测试此代码

      如果您收到 returncode 而不是 0,那么您可以在此处查看该错误代码的含义:http://tldp.org/LDP/abs/html/exitcodes.html

      有关子流程的更多详细信息:http://docs.python.org/library/subprocess.html

      【讨论】:

        【解决方案5】:
        if os.name == 'nt':
        startupinfo = subprocess.STARTUPINFO()
        startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW
        subprocess.call(os.popen(tempFileName), shell=True)
        os.remove(tempFileName)
        

        【讨论】:

          【解决方案6】:

          根据user225312的回答,我准备了以下一行,它可以帮助您测试子流程:

          python -c "import subprocess;
          output = subprocess.Popen(['uname', '-a'], stdout=subprocess.PIPE).communicate()[0]; 
          print output"
          

          结果如下: Linux xxx.xxx.xxx.xxx 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-12-18
            • 1970-01-01
            • 1970-01-01
            • 2020-12-24
            • 1970-01-01
            • 2017-04-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多