我知道如何使用cmd = subprocess.Popen然后subprocess.communicate运行命令.大多数时候我使用shlex.split标记化的字符串作为Popen的'argv'参数."ls -l"的示例:
import subprocess
import shlex
print subprocess.Popen(shlex.split(r'ls -l'), stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()[0]
Run Code Online (Sandbox Code Playgroud)
但是,管道似乎不起作用...例如,以下示例返回注意:
import subprocess
import shlex
print subprocess.Popen(shlex.split(r'ls -l | sed "s/a/b/g"'), stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()[0]
Run Code Online (Sandbox Code Playgroud)
你能告诉我我做错了吗?
谢谢
如何使用子进程模块运行bash脚本,我必须给出几个参数?
这就是我目前使用的:
subprocess.Popen(['/my/file/path/programname.sh', 'arg1 arg2 %s' % arg3], \
shell = True)
Run Code Online (Sandbox Code Playgroud)
bash脚本似乎没有采用任何参数.任何见解都非常感谢!
如果这是我的子流程:
import time, sys
for i in range(200):
sys.stdout.write( 'reading %i\n'%i )
time.sleep(.02)
Run Code Online (Sandbox Code Playgroud)
这是控制和修改子进程输出的脚本:
import subprocess, time, sys
print 'starting'
proc = subprocess.Popen(
'c:/test_apps/testcr.py',
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE )
print 'process created'
while True:
#next_line = proc.communicate()[0]
next_line = proc.stdout.readline()
if next_line == '' and proc.poll() != None:
break
sys.stdout.write(next_line)
sys.stdout.flush()
print 'done'
Run Code Online (Sandbox Code Playgroud)
为什么readline和communicate等待,直到程序完成后运行?有没有一种简单的方法来传递(和修改)子进程'stdout实时?
顺便说一下,我已经看过了,但是我不需要记录功能(并且没有太多的了解它).
我在Windows XP上.
我使用以下命令运行子进程:
p = subprocess.Popen("subprocess",
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
此子进程可以立即退出stderr上的错误,也可以继续运行.我想检测这些条件中的任何一个 - 后者等待几秒钟.
我试过这个:
SECONDS_TO_WAIT = 10
select.select([],
[p.stdout, p.stderr],
[p.stdout, p.stderr],
SECONDS_TO_WAIT)
Run Code Online (Sandbox Code Playgroud)
但它只是返回:
([],[],[])
Run Code Online (Sandbox Code Playgroud)
无论哪种条件.我能做什么?
打开管道到进程后popen,有没有办法杀死已经启动的进程?(使用pclose不是我想要的,因为它将等待进程完成,但我需要杀死它.)
我正试图用来popen()捕捉一个电话的stderr,但当然它似乎并没有这样做.有任何想法吗?
我的代码看起来或多或少像这样:
popen("nedit", "r");
Run Code Online (Sandbox Code Playgroud)
但是我在屏幕上得到了关于非utf8的所有垃圾......
我希望这不是重复.
我正在尝试使用subprocess.Popen()在单独的控制台中打开脚本.我已经尝试过设置shell=True参数,但这并不能解决问题.
我在64位Windows 7上使用32位Python 2.7.
是否可以修改以下代码以从'stdout'和'stderr'打印输出:
代码:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import subprocess
def run_cmd(command, cwd=None):
p = subprocess.Popen(command, cwd=cwd, shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
outs, errs = p.communicate()
rc = p.returncode
outs = outs.decode('utf-8')
errs = errs.decode('utf-8')
return (rc, (outs, errs))
Run Code Online (Sandbox Code Playgroud)
感谢@unutbu,特别感谢@ jf-sebastian,最终功能:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from queue import Queue
from subprocess import PIPE, Popen
from threading import Thread
def read_output(pipe, funcs):
for line in iter(pipe.readline, b''):
for func in funcs: …Run Code Online (Sandbox Code Playgroud) 有没有办法从python调用程序而不等待它返回?我创建了一个脚本,将程序复制到目录并运行该程序.但是当我从python调用程序时,python脚本不会退出,直到我启动的程序退出.我试过os.system和Popen.还有另一种方法吗?
添加信息:os.spawnl与os.P_DETACH仍然不起作用; 根据文档,"P_DETACH类似于P_NOWAIT,但新进程与调用进程的控制台分离".但它仍然以某种方式附加到我的调用进程(调用脚本将不会退出,直到任何被调用的可执行文件返回)
程序:
os.system("start test.exe")
print "Done"
Run Code Online (Sandbox Code Playgroud)
执行test.exe后,它会打印Done.但它不会终止脚本的执行(脚本进程仍在运行).尝试用P_DETACH创建一个守护程序线程和Popen,仍然没有去.
我想在我的C代码中执行二进制文件.执行哪个更好?popen()要么system()
编辑:我试图使用system,但执行过程似乎陷入最后,并没有返回到我的代码.
有关该怎么办的任何建议?
谢谢