相关疑难解决方法(0)

在Python中运行Bash命令

在我的本地机器上,我运行一个包含这一行的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 bash

260
推荐指数
8
解决办法
47万
查看次数

如何使用subprocess.Popen通过管道连接多个进程?

如何使用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是对的,最好避免首先解决这个问题!

python subprocess pipe

52
推荐指数
4
解决办法
5万
查看次数

创建并通过管道传输类似文件的对象作为命令的输入

如果可能的话,我正在寻找更好的方法来做到这一点:

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 中是否有一种方法可以创建一个包含某些内容的“类文件对象”,并将这个类文件对象通过管道作为命令行程序的输入。如果可能的话,我认为这比将文件写入磁盘然后删除该文件更有效。

python linux subprocess file

5
推荐指数
1
解决办法
4714
查看次数

在python中替代子流程

我正在尝试编写一个脚本,该脚本必须对某些bash命令进行大量调用,解析并处理输出,最后给出一些输出。

我正在使用subprocess.Popen和subprocess.call

如果我理解正确,那么这些方法将产生一个bah进程,运行命令,获取输出,然后终止该进程。

有没有办法让bash进程在后台连续运行,然后python调用可以直接进入该进程?这就像是bash作为服务器运行,而python调用了它。

我觉得这会优化通话,因为没有bash流程设置和拆卸。还是没有任何性能优势?

python bash subprocess

5
推荐指数
2
解决办法
7268
查看次数

使用Python的Popen替换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)

python bash subprocess popen

4
推荐指数
1
解决办法
2419
查看次数

标签 统计

python ×5

subprocess ×4

bash ×3

file ×1

linux ×1

pipe ×1

popen ×1