Tag: subprocess

有没有一个安静的subprocess.call版本?

是否有一个subprocess.call的变种,可以运行命令没有打印到标准输出,或者一种方法来阻止它的标准输出消息?

Python OSError:

我有下面的代码试图启动在Linux下面的每个“命令”。 如果任何一个原因导致崩溃,模块会试图保持这两个命令的运行。 #!/usr/bin/env python import subprocess commands = [ ["screen -dmS RealmD top"], ["screen -DmS RealmD top -d 5"] ] programs = [ subprocess.Popen(c) for c in commands ] while True: for i in range(len(programs)): if programs[i].returncode is None: continue # still running else: # restart this one programs[i]= subprocess.Popen(commands[i]) time.sleep(1.0) 在执行代码时引发以下exception: Traceback (most recent […]

从subprocess调用Python程序永远挂起

点testing套件使用subprocess调用来运行集成testing。 最近一个公关被删除了一些旧的兼容性代码。 特别是它明确使用b""文字replace了一个b()函数。 然而,这似乎已经打破了一个特定的subprocess调用永远挂起的地方。 更糟糕的是,它只能永远停留在Python 3.3(也许只有Python 3.3.5)上,并且不能在Travis之外轻松地复制。 相关的请求: https://github.com/pypa/pip/pull/1901 https://github.com/pypa/pip/pull/1900 https://github.com/pypa/pip/pull/1878 其他Pull请求也会出现类似的问题,但是在不同版本的Python和不同的testing用例上会失败。 这些Pull请求是: https://github.com/pypa/pip/pull/1882 https://github.com/pypa/pip/pull/1912(Python 3.3再次) 另一位用户今天在IRC上向我报告了类似的问题,他们说他们可以在Ubuntu 14.04上使用Python 3.3从本地复制它(而不是在OSX上),而不仅仅是在Travis上,就像我迄今为止所做的那样。 他们已经让我步骤重现哪些是: $ git clone git@github.com:xavfernandez/pip.git $ cd pip $ git checkout debug_stuck $ pip install pytest==2.5.2 scripttest==1.3 virtualenv==1.11.6 mock==1.0.1 pretend==1.0.8 setuptools==4.0 $ # The below should pass just fine $ py.test -k test_env_vars_override_config_file -v -s $ […]

如何在多处理器系统上产生并行subprocess?

我有一个Python脚本,我想用作另一个Python脚本的控制器。 我有一个有64个处理器的服务器,所以想要产生多达64个这个第二个Python脚本的subprocess。 子脚本被调用: $ python create_graphs.py –name=NAME NAME是像XYZ,ABC,NYU等 在我的父母控制器脚本中,我从列表中检索名称variables: my_list = [ 'XYZ', 'ABC', 'NYU' ] 所以我的问题是,什么是最好的方式来产生这些进程作为孩子? 我想把孩子的数量限制在64个,所以需要跟踪状态(如果孩子的过程已经完成了),所以我可以有效地保持整个一代的运行。 我考虑使用subprocess包,但拒绝它,因为它一次只产生一个孩子。 我终于find了多处理器软件包,但是我承认被整个线程和subprocess文档所淹没。 现在,我的脚本使用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 = […]

如何从父进程获取subprocess

是否有可能从shell脚本中的父进程ID获取subprocessID? 我有一个使用shell脚本执行的文件,这导致了一个新的进程process1 (父进程)。 该进程1已经分叉了另一个进程进程2 (subprocess)。 使用脚本,我可以使用以下命令获得process1的pid: cat /path/of/file/to/be/executed 但我无法获取subprocess的PID。

subprocess改变目录

我想在一个子目录/超目录中执行一个脚本(我需要先在这个子目录/超级目录中)。 我不能让subprocess进入我的子目录: tducin@localhost:~/Projekty/tests/ve$ python Python 2.7.4 (default, Sep 26 2013, 03:20:26) [GCC 4.7.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import subprocess >>> import os >>> os.getcwd() '/home/tducin/Projekty/tests/ve' >>> subprocess.call(['cd ..']) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/subprocess.py", line 524, in call return Popen(*popenargs, […]

了解Popen.communicate

我有一个名为1st.py的脚本,它创build了一个REPL(read-eval-print-loop): print "Something to print" while True: r = raw_input() if r == 'n': print "exiting" break else: print "continuing" 然后我用以下代码启动1st.py : p = subprocess.Popen(["python","1st.py"], stdin=PIPE, stdout=PIPE) 然后尝试这个: print p.communicate()[0] 它失败了,提供这个追溯: Traceback (most recent call last): File "1st.py", line 3, in <module> r = raw_input() EOFError: EOF when reading a line 你能解释一下这里发生了什么事吗? 当我使用p.stdout.read() ,它永远挂起。

如何杀死(或避免)与subprocess模块的僵尸进程

当我使用subprocess模块在另一个python脚本中启动python脚本时,当subprocess“完成”时会创build一个僵尸进程。 我无法杀死这个subprocess,除非我杀了我的父Python进程。 有没有办法杀死subprocess没有杀死父母? 我知道我可以通过使用wait()来做到这一点,但我需要用no_wait()来运行我的脚本。

如何写入Pythonsubprocess的标准input?

我正在尝试编写一个启动subprocess的Python脚本,并写入subprocess标准input。 如果subprocess崩溃,我也希望能够确定要采取的行动。 我试图启动的过程是一个名为nuke的程序,它有自己的内置版本的Python,我希望能够提交命令,然后在命令执行后告诉它退出。 到目前为止,我已经知道,如果我在命令提示符下启动Python,然后启动nuke作为subprocess,那么我可以键入命令来进行nuke ,但是我希望能够将这些全部放入脚本中主Python程序可以开始nuke ,然后写入其标准input (从而写入其内置版本的Python),并告诉它做些时髦的事情,所以我写了一个脚本,像这样开始nuke : subprocess.call(["C:/Program Files/Nuke6.3v5/Nuke6.3", "-t", "E:/NukeTest/test.nk"]) 然后没有任何反应,因为nuke正在等待用户input。 我现在怎么写标准input? 我这样做是因为我正在运行一个nuke插件,导致它在渲染多个帧时间歇性地崩溃。 所以我希望这个脚本能够开始nuke ,告诉它做些什么,然后如果崩溃,再试一次。 所以,如果有一个方法来赶上崩溃,仍然可以,那就太好了。

Pythonsubprocess:cmd退出时的callback

我正在启动一个程序使用subprocess.Popen(cmd, shell=TRUE) 我对Python相当陌生,但是觉得应该有一些API让我做类似的事情: subprocess.Popen(cmd, shell=TRUE, postexec_fn=function_to_call_on_exit) 我正在这样做,以便function_to_call_on_exit可以基于知道cmd已经退出(例如保持当前正在运行的外部进程数) 我假设我可以相当简单地将子Popen.wait()封装在一个将线程与Popen.wait()方法结合在一起的类中,但由于我还没有在Python中进行线程化,所以似乎这可能足以使API存在,我想我会试着find一个。 提前致谢 :)