当我使用子进程模块从另一个python脚本中启动python脚本时,子进程"完成"时会创建一个僵尸进程.除非我杀死我的父python进程,否则我无法终止此子进程.
有没有办法杀死子进程而不杀死父进程?我知道我可以通过使用wait()来实现这一点,但我需要使用no_wait()运行我的脚本.
我想以下列方式使用子进程模块:
stdout(或者stderr,或者两者一起或分别捕获)我已经用Popen创建了进程,但是如果我使用communication(),那么一旦进程终止,数据就会立刻出现在我面前.
如果我创建一个单独的线程,做了阻塞readline()的myprocess.stdout(使用stdout = subprocess.PIPE)我不明白这种方法的任何行或者,直到进程终止.(无论我设置为bufsize)
有没有办法解决这个不可怕的问题,并且在多个平台上运行良好?
我需要推出一批具有长期运行的进程subprocess.Popen,并希望有stdout与stderr从各自动管道分离日志文件.每个进程将同时运行几分钟,并且我希望在进程运行时将每个进程写入两个日志文件(stdout和stderr).
我需要不断地调用p.communicate(),以便更新每个日志文件上的每个进程在循环,或者是有一些方法来调用原有的Popen命令,以便stdout和stderr自动传输到打开的文件句柄?
这些是我的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是新包吗?如何解决这个问题呢?
我使用一个使用bash源功能扩展的脚本;
#!/bin/bash
source someneatscriptthatendsprematurely.sh
Run Code Online (Sandbox Code Playgroud)
我希望能够从该脚本返回,而不会破坏主脚本.
使用退出中断主脚本,返回仅在函数中有效,并且试验$(退出1)似乎也不起作用.
那么,是否可以在不破坏主bash的情况下返回子bash脚本?
任何帮助赞赏!
我有一些自定义命令.
# 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下执行此操作.
我正在使用这个subprocess.Popen调用,在另一个问题中,我发现我误解了Python是如何为命令行生成参数的.
我的问题
有没有办法找出实际的命令行是什么?
示例代码: -
proc = subprocess.popen(....)
print "the commandline is %s" % proc.getCommandLine()
Run Code Online (Sandbox Code Playgroud)
你会怎么写getCommandLine?
我试图用非默认浏览器启动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进程,它使用子进程在发生某些事件时生成新的子进程.长时间运行的进程由具有超级用户权限的用户启动.我需要它生成的子进程作为不同的用户(例如,"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在该领域非常稀少.
我一直在尝试传递一个在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命令?
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