标签: subprocess

如何在多处理器系统上生成并行子进程?

我有一个Python脚本,我想用作另一个Python脚本的控制器.我有一个64位处理器的服务器,所以想要产生第二个Python脚本的64个子进程.子脚本被调用:

$ python create_graphs.py --name=NAME
Run Code Online (Sandbox Code Playgroud)

其中NAME是XYZ,ABC,NYU等.

在我的父控制器脚本中,我从列表中检索名称变量:

my_list = [ 'XYZ', 'ABC', 'NYU' ]
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,作为孩子产生这些过程的最佳方法是什么?我想一次将子项数限制为64,因此需要跟踪状态(如果子进程已完成或未完成),这样我就可以有效地保持整个代的运行.

我查看了使用子进程包,但拒绝它,因为它一次只生成一个子进程.我终于找到了多处理器包,但我承认被整个线程与子进程文档所淹没.

现在,我的脚本subprocess.call一次只生成一个孩子,看起来像这样:

#!/path/to/python
import subprocess, multiprocessing, Queue
from multiprocessing import Process

my_list = [ 'XYZ', 'ABC', 'NYU' ]

if __name__ == '__main__':
    processors = multiprocessing.cpu_count()

    for i in range(len(my_list)):
        if( i < processors ):
             cmd = ["python", "/path/to/create_graphs.py", "--name="+ my_list[i]]
             child = subprocess.call( cmd, shell=False )
Run Code Online (Sandbox Code Playgroud)

我真的希望它一次产生64个孩子.在其他stackoverflow问题中,我看到人们使用Queue,但似乎这会产生性能损失?

python subprocess exec multiprocessing

42
推荐指数
1
解决办法
5万
查看次数

检查CalledProcessError的输出

我正在使用pythons子进程模块中的subprocess.check_output来执行ping命令.我是这样做的:

output = subprocess.check_output(["ping","-c 2 -W 2","1.1.1.1")
Run Code Online (Sandbox Code Playgroud)

它引发了一个CalledProcessError,并说输出是函数的参数之一.任何人都可以帮我如何阅读该输出.我想将输出读入一个字符串并解析它.例如,如果ping返回,请说

100%丢包

我需要抓住它.如果有任何其他更好的方法..请建议.谢谢.

python subprocess

42
推荐指数
3
解决办法
9万
查看次数

非阻塞subprocess.call

我正在尝试进行非阻塞子进程调用,以便从我的main.py程序运行slave.py脚本.我需要将args从main.py传递给slave.py一旦它(slave.py)首次通过subprocess.call启动,此slave.py运行一段时间然后退出.

main.py
for insert, (list) in enumerate(list, start =1):

    sys.args = [list]
    subprocess.call(["python", "slave.py", sys.args], shell = True)


{loop through program and do more stuff..}
Run Code Online (Sandbox Code Playgroud)

还有我的奴隶剧本

slave.py
print sys.args
while True:
    {do stuff with args in loop till finished}
    time.sleep(30)
Run Code Online (Sandbox Code Playgroud)

目前,slave.py阻止main.py运行其余的任务,我只想让slave.py独立于main.py,一旦我将args传递给它.这两个脚本不再需要通信.

我在网上发现了一些关于非阻塞subprocess.call的帖子,但是大多数帖子都集中在需要与slave.py进行通信,而这在某些方面我目前并不需要.谁会知道如何以简单的方式实现这一点......?

python subprocess

42
推荐指数
3
解决办法
4万
查看次数

subprocess.check_output返回代码

我在用:

grepOut = subprocess.check_output("grep " + search + " tmp", shell=True)
Run Code Online (Sandbox Code Playgroud)

要运行终端命令,我知道我可以使用try/except来捕获错误但是如何获取错误代码的值?

我在官方文档中找到了这个:

 exception subprocess.CalledProcessError

    Exception raised when a process run by check_call() or check_output() returns a non-zero exit status.

    returncode

        Exit status of the child process.
Run Code Online (Sandbox Code Playgroud)

但是没有给出任何例子,谷歌没有任何帮助.

python subprocess

42
推荐指数
3
解决办法
6万
查看次数

从python脚本以超级用户身份运行命令

因此,我正在尝试使用子进程从python脚本中以超级用户身份运行进程.在ipython shell中就像是

proc = subprocess.Popen('sudo apach2ctl restart',
                        shell=True, stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

工作正常,但一旦我把它插入脚本,我开始得到:sudo: apach2ctl: command not found.

我猜这是由于sudo在ubuntu上处理环境的方式.(我也尝试sudo -E apche2ctl restartsudo env path=$PATH apache2ctl restart与无济于事)

所以我的问题基本上是,如果我想以apache2ctl restart超级用户身份运行,在需要时提示用户输入超级用户密码,我应该怎么做呢?我无意在脚本中存储密码.

编辑:

我已经尝试将命令作为字符串传递并标记为列表.在python解释器中,使用字符串我将正确地获得密码提示(仍然不像我原来的问题那样在python脚本中工作),列表只是给出了sudo的帮助屏幕.

编辑2:

所以我收集的是,当shell = True时,Popen将使用一些命令作为字符串,这需要

proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])
Run Code Online (Sandbox Code Playgroud)

没有'shell = True'让sudo工作.

谢谢!

python sudo subprocess

41
推荐指数
6
解决办法
10万
查看次数

Python:如何防止子进程接收CTRL-C/Control-C/SIGINT

我目前正在为shell中运行的专用服务器开发包装器.包装器通过子进程生成服务器进程,并观察并响应其输出.

必须明确地为专用服务器提供一个命令才能正常关闭.因此,CTRL-C不得访问服务器进程.

如果我捕获KeyboardInterrupt异常或覆盖python中的SIGINT处理程序,服务器进程仍然会收到CTRL-C并立即停止.

所以我的问题是:如何防止子进程接收CTRL-C/Control-C/SIGINT?

python subprocess signals sigint keyboardinterrupt

40
推荐指数
4
解决办法
1万
查看次数

使用子进程在Windows上运行Python脚本

有没有一种在Windows/Linux/OS X上运行Python脚本的简单方法?

在后两个,subprocess.Popen("/the/script.py")工作,但在Windows上我得到以下错误:

Traceback (most recent call last):
  File "test_functional.py", line 91, in test_functional
    log = tvnamerifiy(tmp)
  File "test_functional.py", line 49, in tvnamerifiy
    stdout = PIPE
  File "C:\Python26\lib\subprocess.py", line 595, in __init__
    errread, errwrite)
  File "C:\Python26\lib\subprocess.py", line 804, in _execute_child
    startupinfo)
WindowsError: [Error 193] %1 is not a valid Win32 application
Run Code Online (Sandbox Code Playgroud)

monkut的评论:用例不明确.为什么要使用subprocess来运行python脚本?是否有什么东西阻止您导入脚本并调用必要的功能?

我正在编写一个快速脚本来测试Python命令行工具的整体功能(在各种平台上测试它).基本上它必须在临时文件夹中创建一堆文件,在此上运行脚本并检查文件是否已正确重命名.

我本可以导入脚本并调用函数,但由于它依赖sys.argv并使用sys.exit(),我本来需要做类似的事情.

import sys
import tvnamer
sys.argv.append("-b", "/the/folder")
try:
    tvnamer.main()
except BaseException, errormsg:
    print type(errormsg)
Run Code Online (Sandbox Code Playgroud)

另外,我想捕获stdout和stderr以便调试出错的地方.

当然更好的方法是以更可单元测试的方式编写脚本,但脚本基本上是"完成",我在做一个"1.0"版本之前做了最后一批测试(之后我会去进行重写/重组,这将更加整洁,更加可测试

基本上,在找到sys.executable变量之后,简单地将脚本作为进程运行要容易得多.我会把它写成一个shell脚本,但这不会是跨平台的.最终的脚本可以在 …

python windows subprocess

39
推荐指数
4
解决办法
9万
查看次数

python中子进程读取线上的超时

我有一个小问题,我不太确定如何解决.这是一个最小的例子:

是)我有的

scan_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while(some_criterium):
    line = scan_process.stdout.readline()
    some_criterium = do_something(line)
Run Code Online (Sandbox Code Playgroud)

我想要什么

scan_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while(some_criterium):
    line = scan_process.stdout.readline()
    if nothing_happens_after_10s:
        break
    else:
        some_criterium = do_something(line)
Run Code Online (Sandbox Code Playgroud)

我从子进程读取一行并用它做一些事情.我想要的是在固定时间间隔后没有线路到达时退出.有什么建议?

python subprocess timeout

39
推荐指数
5
解决办法
3万
查看次数

Python子进程:打开文件太多

我正在使用子进程调用另一个程序并将其返回值保存到变量.此过程在循环中重复,并在几千次之后程序崩溃并出现以下错误:

Traceback (most recent call last):
  File "./extract_pcgls.py", line 96, in <module>
    SelfE.append( CalSelfEnergy(i) )
  File "./extract_pcgls.py", line 59, in CalSelfEnergy
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
  File "/usr/lib/python3.2/subprocess.py", line 745, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.2/subprocess.py", line 1166, in _execute_child
    errpipe_read, errpipe_write = _create_pipe()
OSError: [Errno 24] Too many open files
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决这个问题非常感谢!

评论提供的代码:

cmd = "enerCHARMM.pl -parram=x,xtop=topology_modified.rtf,xpar=lipid27_modified.par,nobuildall -out vdwaals {0}".format(cmtup[1])
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
out, err = p.communicate()
Run Code Online (Sandbox Code Playgroud)

python subprocess

39
推荐指数
7
解决办法
5万
查看次数

Python3子进程输出

我想运行Linux字数统计实用程序wc来确定当前在/ var/log/syslog中的行数,因此我可以检测到它正在增长.我尝试了各种测试,当我从wc获得结果时,它既包括行数也包括命令(例如,var/log/syslog).

所以它返回:1338/var/log/syslog但我只想要行数,所以我想剥离/ var/log/syslog部分,并保持1338.

我已经尝试将它从bytestring转换为字符串,然后剥离结果,但没有快乐.转换为字符串和剥离,解码等的相同故事 - 都无法产生我正在寻找的输出.

这些是我得到的一些例子,在syslog中有1338行:

  • b'1338/var/log/syslog \n'
  • 1338/var/log/syslog

这是我编写的一些测试代码,试图破解这个问题,但没有解决方案:

import subprocess

#check_output returns byte string
stdoutdata = subprocess.check_output("wc --lines /var/log/syslog", shell=True)
print("2A stdoutdata: " + str(stdoutdata))
stdoutdata = stdoutdata.decode("utf-8")
print("2B stdoutdata: " + str(stdoutdata))    
stdoutdata=stdoutdata.strip()
print("2C stdoutdata: " + str(stdoutdata))    
Run Code Online (Sandbox Code Playgroud)

这个输出是:

  • 2A stdoutdata:b'1338/var/log/syslog \n'

  • 2B stdoutdata:1338/var/log/syslog

  • 2C stdoutdata:1338/var/log/syslog

  • 2D stdoutdata:1338/var/log/syslog

python subprocess bytestring python-3.x

39
推荐指数
3
解决办法
5万
查看次数