在我的本地机器上,我运行一个包含这一行的python脚本
bashCommand = "cwm --rdf test.rdf --ntriples > test.nt"
os.system(bashCommand)
Run Code Online (Sandbox Code Playgroud)
这很好用.
然后我在服务器上运行相同的代码,我收到以下错误消息
'import site' failed; use -v for traceback
Traceback (most recent call last):
File "/usr/bin/cwm", line 48, in <module>
from swap import diag
ImportError: No module named swap
Run Code Online (Sandbox Code Playgroud)
所以我所做的就是插入一个"print bashCommand",它在使用os.system()运行它之前打印我,而不是终端中的命令.
当然,我再次得到错误(由os.system(bashCommand)引起)但在该错误之前它在终端中打印命令.然后我只是复制了那个输出并在终端上做了一个复制粘贴,然后点击回车就可以了......
有没有人知道发生了什么?
如何使用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是对的,最好避免首先解决这个问题!
如果可能的话,我正在寻找更好的方法来做到这一点:
import subprocess
f = open('temp.file', 'w+')
f.write('hello world')
f.close()
out = subprocess.check_output(['cat', 'temp.file'])
print out
subprocess.check_output(['rm', 'temp.file'])
Run Code Online (Sandbox Code Playgroud)
在此示例中,我正在创建一个文件并将其作为输入传递给cat(实际上不是cat我正在运行,而是解析输入文件的其他程序pcap)。
我想知道的是,在 Python 中是否有一种方法可以创建一个包含某些内容的“类文件对象”,并将这个类文件对象通过管道作为命令行程序的输入。如果可能的话,我认为这比将文件写入磁盘然后删除该文件更有效。
我正在尝试编写一个脚本,该脚本必须对某些bash命令进行大量调用,解析并处理输出,最后给出一些输出。
我正在使用subprocess.Popen和subprocess.call
如果我理解正确,那么这些方法将产生一个bah进程,运行命令,获取输出,然后终止该进程。
有没有办法让bash进程在后台连续运行,然后python调用可以直接进入该进程?这就像是bash作为服务器运行,而python调用了它。
我觉得这会优化通话,因为没有bash流程设置和拆卸。还是没有任何性能优势?
在Bash中,您可以轻松地将进程的输出重定向到临时文件描述符,并且所有这些都由bash自动处理,如下所示:
$ mydaemon --config-file <(echo "autostart: True \n daemonize: True")
Run Code Online (Sandbox Code Playgroud)
或者像这样:
$ wc -l <(ls)
15 /dev/fd/63
Run Code Online (Sandbox Code Playgroud)
看看它是如何不是stdin重定向:
$ vim <(echo "Hello World")
vim opens a text file containing "Hello world"
$ echo "Hello World" | vim
Vim: Warning: Input is not from a terminal
Run Code Online (Sandbox Code Playgroud)
您可以在第二个示例中看到bash如何自动创建文件描述符,并允许您将程序的输出传递给另一个程序.
现在谈到我的问题:如何在Python中使用Popen在子进程模块中做同样的事情?
我一直在使用普通的kmers文件并只是读取它,但我的程序现在根据用户参数在运行时生成一个特定的kmers列表.我想避免手动写入临时文件,因为处理文件权限可能会导致我的原始用户出现问题.
这是我运行程序并使用实际文件"kmer_file"捕获stdout的代码
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)
Run Code Online (Sandbox Code Playgroud)
我创建了一个名为generate_kmers的函数,它返回一个可以轻松写入文件的字符串(包括换行符)或StringIO.我还有一个独立的python脚本来做同样的事情
所以现在我想把它作为我的第三个参数传递:
这不起作用:
kmer_file = stringIO(generate_kmers(3))
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)
Run Code Online (Sandbox Code Playgroud)
这也不是:
kmer_file = Popen(["generate_kmers", str(kmer)], stdout=PIPE)
input_file = Popen(["pram_axdnull", str(kmer), input_file, …Run Code Online (Sandbox Code Playgroud)