标签: subprocess

如何使用子进程模块杀死(或避免)僵尸进程

当我使用子进程模块从另一个python脚本中启动python脚本时,子进程"完成"时会创建一个僵尸进程.除非我杀死我的父python进程,否则我无法终止此子进程.

有没有办法杀死子进程而不杀死父进程?我知道我可以通过使用wait()来实现这一点,但我需要使用no_wait()运行我的脚本.

python subprocess

51
推荐指数
6
解决办法
5万
查看次数

如何从subprocess.Popen中获取'实时'信息在python(2.5)中

我想以下列方式使用子进程模块:

  1. 创建一个可能需要很长时间才能执行的新流程.
  2. 捕获stdout(或者stderr,或者两者一起或分别捕获)
  3. 处理来自子进程的数据,可能在接收的每一行上触发事件(在wxPython中说)或者只是暂时将它们打印出来.

我已经用Popen创建了进程,但是如果我使用communication(),那么一旦进程终止,数据就会立刻出现在我面前.

如果我创建一个单独的线程,做了阻塞readline()myprocess.stdout(使用stdout = subprocess.PIPE)我不明白这种方法的任何行或者,直到进程终止.(无论我设置为bufsize)

有没有办法解决这个不可怕的问题,并且在多个平台上运行良好?

python subprocess stdout popen

46
推荐指数
2
解决办法
1万
查看次数

管道输出subprocess.Popen到文件

我需要推出一批具有长期运行的进程subprocess.Popen,并希望有stdoutstderr从各自动管道分离日志文件.每个进程将同时运行几分钟,并且我希望在进程运行时将每个进程写入两个日志文件(stdoutstderr).

我需要不断地调用p.communicate(),以便更新每个日志文件上的每个进程在循环,或者是有一些方法来调用原有的Popen命令,以便stdoutstderr自动传输到打开的文件句柄?

python subprocess stdout

46
推荐指数
2
解决办法
6万
查看次数

python subprocess check_output返回非零退出状态1

这些是我的python代码:

import subprocess
subprocess.check_output("ls",shell=True,stderr=subprocess.STDOUT)

import subprocess
subprocess.check_output("yum",shell=True,stderr=subprocess.STDOUT)
Run Code Online (Sandbox Code Playgroud)

第一次工作顺利,但第二次回归:

Traceback (most recent call last):
File "/usr/lib/x86_64-linux-gnu/gedit/plugins/pythonconsole/console.py", line 378, in __run
r = eval(command, self.namespace, self.namespace)
File "<string>", line 1, in <module>
File "/usr/lib/python3.4/subprocess.py", line 616, in check_output
raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command 'yum' returned non-zero exit status 1
Run Code Online (Sandbox Code Playgroud)

为什么会这样?是因为ls是原始shell命令,但是yum是新包吗?如何解决这个问题呢?

python subprocess python-3.x

46
推荐指数
2
解决办法
8万
查看次数

你如何回到源bash脚本?

我使用一个使用bash源功能扩展的脚本;

#!/bin/bash

source someneatscriptthatendsprematurely.sh
Run Code Online (Sandbox Code Playgroud)

我希望能够从该脚本返回,而不会破坏主脚本.

使用退出中断主脚本,返回仅在函数中有效,并且试验$(退出1)似乎也不起作用.

那么,是否可以在不破坏主bash的情况下返回子bash脚本?

任何帮助赞赏!

bash subprocess return exit

45
推荐指数
1
解决办法
2万
查看次数

Popen错误:[Errno 2]没有这样的文件或目录

我有一些自定义命令.

# works 
subprocess.Popen(['python'], stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

但是,如果我有自己的系统命令deactivate,我会得到那个错误

Traceback (most recent call last):
  File "runner2.py", line 21, in <module>
    main() 
  File "runner2.py", line 18, in main
    subprocess.Popen(['deactivate',], stdout=subprocess.PIPE)
  File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)

更别说我需要在我的沙箱virtualenv下执行此操作.

python subprocess popen

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

输出子进程调用的命令行?

我正在使用这个subprocess.Popen调用,在另一个问题中,我发现我误解了Python是如何为命令行生成参数的.

我的问题
有没有办法找出实际的命令行是什么?

示例代码: -

proc = subprocess.popen(....)
print "the commandline is %s" % proc.getCommandLine()
Run Code Online (Sandbox Code Playgroud)

你会怎么写getCommandLine

python command-line subprocess popen

45
推荐指数
2
解决办法
3万
查看次数

使用选定的浏览器启动IPython笔记本

我试图用非默认浏览器启动IPython(在我的情况下是Firefox),并且我认为我可以复制复制该博客中给出的脚本

我在Windows 7上

我把以下代码放在一个文件中说"module.py"

import subprocess
subprocess.call("ipython notebook --no-browser", shell=True)
subprocess.call([r'C:\Program Files (x86)\Mozilla Firefox\Firefox.exe', '-new-tab', 'http://127.0.0.1:8888/'])
Run Code Online (Sandbox Code Playgroud)

但是,当我从命令行运行它时

 python C:\Users\mugabal\Desktop\module1.py
Run Code Online (Sandbox Code Playgroud)

它执行第一行而不是第二行(两行都单独工作)

我的问题(用更通用的术语)我如何启动一个进程并告诉它不要高举控制台窗口?

如果我已经监督了一个明显的解释,我提前道歉,但我在子流程文档和这个平台上都看了

-----更新-----

我应该补充一点,我试图用选定的浏览器启动IPython,但无法弄清楚如何让它工作

>ipython notebook --browser='C:\Program Files (x86)\Mozilla Firefox\Firefox.exe'
... 
[NotebookApp] The IPython Notebook is running at: http://127.0.0.1:8888/
...
**[NotebookApp] No web browser found: could not locate runnable browser.**
Run Code Online (Sandbox Code Playgroud)

确切地说,Windows命令提示符窗口中的以下命令按预期工作:

start firefox 
Run Code Online (Sandbox Code Playgroud)

ipython notebook --browser=firefox 
Run Code Online (Sandbox Code Playgroud)

不起作用(与上面相同的错误).

python windows subprocess ipython

45
推荐指数
5
解决办法
9万
查看次数

将子进程作为不同用户从长时间运行的Python进程运行

我有一个长期运行的,守护进程的Python进程,它使用子进程在发生某些事件时生成新的子进程.长时间运行的进程由具有超级用户权限的用户启动.我需要它生成的子进程作为不同的用户(例如,"nobody")运行,同时保留父进程的超级用户权限.

我正在使用

su -m nobody -c <program to execute as a child>
Run Code Online (Sandbox Code Playgroud)

但这似乎是重量级的,并不会非常干净地死去.

有没有办法以编程方式完成此操作而不是使用su?我正在查看os.set*uid方法,但Python std lib中的doc在该领域非常稀少.

python fork subprocess setuid

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

将python中的双引号shell命令传递给subprocess.Popen()?

我一直在尝试传递一个在shell中工作的命令,它只能在"concat:file1|file2"ffmpeg参数的命令行中使用文字双引号.

但我不能用python做这个工作subprocess.Popen().任何人都知道如何将引号传递给subprocess.Popen?

这是代码:

command = "ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy temp.mp4"

output,error = subprocess.Popen(command, universal_newlines=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE).communicate()
Run Code Online (Sandbox Code Playgroud)

当我这样做时,除了在concat segement周围的引号之外,ffmpeg不会采取任何其他方式.有没有办法成功将此行传递给subprocess.Popen命令?

python subprocess

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

标签 统计

subprocess ×10

python ×9

popen ×3

stdout ×2

bash ×1

command-line ×1

exit ×1

fork ×1

ipython ×1

python-3.x ×1

return ×1

setuid ×1

windows ×1