我在命令行中做了什么:
cat file1 file2 file3 > myfile
Run Code Online (Sandbox Code Playgroud)
我想用python做什么:
import subprocess, shlex
my_cmd = 'cat file1 file2 file3 > myfile'
args = shlex.split(my_cmd)
subprocess.call(args) # spits the output in the window i call my python program
Run Code Online (Sandbox Code Playgroud) 我已经阅读了subprocess.Popen上的所有内容,但是我想我缺少了一些东西。
我需要能够执行一个Unix程序,该程序从python脚本中创建的列表中读取数据流并将该程序的结果写入文件。在bash提示符下,我一直都没问题,但现在我尝试从python脚本中执行此操作,该脚本在进入此阶段之前会先预处理一些二进制文件和大量数据。
让我们看一个不包含所有预处理的简单示例:
import sys
from pylab import *
from subprocess import *
from shlex import split
# some arbitrary x,y points
points = [(11,31),(13,33),(15,37),(16,35),(17,38),(18,39.55)]
commandline = 'my_unix_prog option1 option2 .... > outfile'
command = split(commandline)
process = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
print process.communicate(str(points))
Run Code Online (Sandbox Code Playgroud)
在bash中执行的方式是:
echo "11 31
13 33
15 37
16 35
17 38
18 39.55" | my_unix_prog option1 option2 .... > outfile
Run Code Online (Sandbox Code Playgroud)
数据输入到unix prog的方式也很重要,我应该格式化为两列,并用空格隔开。
任何帮助表示赞赏...
我试图通过Python的子进程运行命令,但无法正常运行。如果我输入外壳:
pack < packfile.dat
Run Code Online (Sandbox Code Playgroud)
pack我的软件在哪里,又packfile是输入文件,那么软件运行正常。
如果我在python中尝试:
import subprocess as sp
import shlex
cmd = 'pack < packfile.dat'.split()
p = sp.Popen(cmd)
Run Code Online (Sandbox Code Playgroud)
该软件抱怨:
Pack must be run with: pack < inputfile.inp
Reading input file... (Control-C aborts)
Run Code Online (Sandbox Code Playgroud)
它挂在那里。
最后一部分特定于我的软件,但事实是,运行两种命令的两种方法给出的结果不同,而实际情况并非如此。
谁能告诉我我在做什么错?
实际上,我最终打算这样做:
p = sp.Popen(cmd,stdout=sp.PIPE,stderr=sp.PIPE)
stdout, stderr = p.communicate()
Run Code Online (Sandbox Code Playgroud)
由于我对此并不陌生,如果这不是最佳做法,请告诉我。
提前致谢。