我正在尝试用Python进行系统调用,并将输出存储到我可以在Python程序中操作的字符串中.
#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")
Run Code Online (Sandbox Code Playgroud)
我尝试了一些事情,包括一些建议:
但没有任何运气.
我用subprocess
模块调用不同的进程.但是,我有一个问题.
在以下代码中:
callProcess = subprocess.Popen(['ls', '-l'], shell=True)
Run Code Online (Sandbox Code Playgroud)
和
callProcess = subprocess.Popen(['ls', '-l']) # without shell
Run Code Online (Sandbox Code Playgroud)
两者都有效.阅读文档后,我开始知道这shell=True
意味着通过shell执行代码.这意味着在缺席的情况下,该过程将直接启动.
那么我应该更喜欢我的情况 - 我需要运行一个进程并获得其输出.从shell内部或外部调用它有什么好处.
我正在尝试编写一个启动子进程的Python脚本,并写入子进程stdin.我还希望能够确定子进程崩溃时要采取的操作.
我正在尝试启动的过程是一个程序nuke
,它有自己的内置版本的Python,我希望能够提交命令,然后告诉它在执行命令后退出.到目前为止,我已经知道,如果我在命令提示符上启动Python,然后nuke
作为子进程启动,那么我可以输入命令nuke
,但我希望能够将所有这些都放在一个脚本中,以便主Python程序可以启动nuke
然后写入其标准输入(因此也可以写入其内置版本的Python),并告诉它做一些时髦的东西,所以我编写了一个脚本,nuke
如下所示:
subprocess.call(["C:/Program Files/Nuke6.3v5/Nuke6.3", "-t", "E:/NukeTest/test.nk"])
Run Code Online (Sandbox Code Playgroud)
然后没有任何事情发生,因为nuke
等待用户输入.我现在如何写入标准输入?
我这样做是因为我正在运行一个插件nuke
,导致它在渲染多个帧时间歇性地崩溃.所以我希望这个脚本能够启动nuke
,告诉它做某事然后如果它崩溃了,再试一次.因此,如果有办法赶上崩溃并且仍然可以,那就太棒了.
如何使用Python subprocess
模块执行以下shell命令?
echo "input data" | awk -f script.awk | sort > outfile.txt
Run Code Online (Sandbox Code Playgroud)
输入数据将来自一个字符串,所以我实际上并不需要echo
.我已经走到这一步了,任何人都可以解释我是如何通过它来解决的sort
吗?
p_awk = subprocess.Popen(["awk","-f","script.awk"],
stdin=subprocess.PIPE,
stdout=file("outfile.txt", "w"))
p_awk.communicate( "input data" )
Run Code Online (Sandbox Code Playgroud)
更新:请注意,虽然下面接受的答案实际上没有回答问题,但我相信S.Lott是对的,最好避免首先解决这个问题!
我想在以下行使用子进程:
convert ../loxie-orig.png bmp:- | mkbitmap -f 2 -s 2 -t 0.48 | potrace -t 5 --progress -s -o ../DSC00232.svg
Run Code Online (Sandbox Code Playgroud)
我感谢其他帖子的子流程文档,但在示例中我们只使用了两次管道.
所以,我尝试三个命令中的两个,它的工作原理
p1 = subprocess.Popen(['convert', fileIn, 'bmp:-'], stdout=subprocess.PIPE)
# p2 = subprocess.Popen(['mkbitmap', '-f', '2', '-s', '2', '-t', '0.48'], stdout=subprocess.PIPE)
p3 = subprocess.Popen(['potrace', '-t' , '5', '-s' , '-o', fileOut], stdin=p1.stdout,stdout=subprocess.PIPE)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p3 exits.
output = p3.communicate()[0]
Run Code Online (Sandbox Code Playgroud)
你能帮助我完成第三个命令吗?
非常感谢你.
cmd= ["sudo", "cat", "{filepath}".format(filepath=filepath), "|","egrep", "-v","\'{filteruser}\'".format(filteruser=filteruser)]
Run Code Online (Sandbox Code Playgroud)
fileformat和filteruser也可以是空白的
[plugin_haproxy]
user= tara
host=localhost
filepath=/etc/haproxy/haproxy.global.inc
filter=
Run Code Online (Sandbox Code Playgroud)
这是我想在子进程上运行的命令,用pdb检查上面的变量值显示波纹管值并且看起来很棒
['sudo', 'cat', '/etc/haproxy/haproxy.global.inc', '|', 'egrep', '-v', "''"]
Run Code Online (Sandbox Code Playgroud)
Manullay运行代码sudo cat /etc/haproxy/haproxy.global.inc | 终端上的egrep -v"''"很棒
为什么子进程无法处理它.
"cat:|:没有这样的文件或目录\n \ncat:egrep:没有这样的文件或目录\n \ncat:
我想做的要点是:
grep -n "some phrase" {some file path} | head -1
Run Code Online (Sandbox Code Playgroud)
我想将其输出传递到 python 中。到目前为止我尝试过的是:
p = subprocess.Popen('grep -n "some phrase" {some file path} | head -1',shell=True,stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
我收到很多回复说
"grep: writing output: Broken pipe"
Run Code Online (Sandbox Code Playgroud)
我对该模块不太熟悉subprocess
,我想了解如何获得此输出以及我目前做错了什么。
我想bash
在python程序中运行以下几行linux 命令.
tail /var/log/omxlog | stdbuf -o0 grep player_new | while read i
do
Values=$(omxd S | awk -F/ '{print $NF}')
x1="${Values}"
x7="${x1##*_}"
x8="${x7%.*}"
echo ${x8}
done
Run Code Online (Sandbox Code Playgroud)
我知道对于单行命令,我们可以使用以下语法:
subprocess.call(['my','command'])
Run Code Online (Sandbox Code Playgroud)
但是,subprocess.call
如果多行中有多个命令,我该如何使用?