相关疑难解决方法(0)

如何在管道中使用`subprocess`命令

我想subprocess.check_output()ps -A | grep 'process_name'.我尝试了各种解决方案,但到目前为止没有任 有人可以指导我怎么做吗?

python linux subprocess pipe

214
推荐指数
6
解决办法
20万
查看次数

如何逃避os.system()调用?

使用os.system()时,通常需要将作为参数传递的文件名和其他参数转义为命令.我怎样才能做到这一点?优选地,可以在多个操作系统/壳上工作但特别是用于bash的东西.

我目前正在做以下操作,但我确定必须有一个库函数,或者至少是一个更优雅/更健壮/更有效的选项:

def sh_escape(s):
   return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")

os.system("cat %s | grep something | sort > %s" 
          % (sh_escape(in_filename), 
             sh_escape(out_filename)))
Run Code Online (Sandbox Code Playgroud)

编辑:我接受了使用引号的简单答案,不知道为什么我没有想到这一点; 我猜是因为我来自Windows,其中'和'的表现略有不同.

关于安全性,我理解这个问题,但是,在这种情况下,我对os.system()提供的快速简单的解决方案感兴趣,并且字符串的来源要么不是用户生成的,要么至少是由用户输入的.可信用户(我).

python shell escaping

114
推荐指数
5
解决办法
9万
查看次数

如何捕获Python subprocess.check_output()的异常输出?

我正在尝试从Python中进行比特币支付.在bash中我通常会这样做:

bitcoin sendtoaddress <bitcoin address> <amount>
Run Code Online (Sandbox Code Playgroud)

例如:

bitcoin sendtoaddress 1HoCUcbK9RbVnuaGQwiyaJGGAG6xrTPC9y 1.4214
Run Code Online (Sandbox Code Playgroud)

如果它是成功的我得到一个事务ID作为输出,但如果我尝试转移大于我的比特币余额的数量,我得到以下输出:

error: {"code":-4,"message":"Insufficient funds"}
Run Code Online (Sandbox Code Playgroud)

在我的Python程序中,我现在尝试按以下方式进行付款:

import subprocess

try:
    output = subprocess.check_output(['bitcoin', 'sendtoaddress', address, str(amount)])
except:
    print "Unexpected error:", sys.exc_info()
Run Code Online (Sandbox Code Playgroud)

如果有足够的余额它可以正常工作,但如果没有足够的余额sys.exc_info()打印出来:

(<class 'subprocess.CalledProcessError'>, CalledProcessError(), <traceback object at 0x7f339599ac68>)
Run Code Online (Sandbox Code Playgroud)

它不包括我在命令行上得到的错误.所以我的问题是; 如何{"code":-4,"message":"Insufficient funds"}从Python中获取输出的错误()?

欢迎所有提示!

python bash subprocess

55
推荐指数
7
解决办法
10万
查看次数

Python - 如何用管道执行shell命令?

我有一个案例要在Python中执行以下shell命令并获取输出,

echo This_is_a_testing | grep -c test
Run Code Online (Sandbox Code Playgroud)

我可以使用这个python代码在python中执行上面的shell命令,

>>> import subprocess
>>> subprocess.check_output("echo This_is_a_testing | grep -c test", shell=True)
'1\n'
Run Code Online (Sandbox Code Playgroud)

但是,由于我不想使用"shell = True"选项,我尝试了以下python代码,

>>> import subprocess
>>> p1 = subprocess.Popen(["echo", "This_is_a_testing"], stdout=subprocess.PIPE)
>>> p2 = subprocess.Popen(["grep", "-c", "test"], stdin=p1.stdout)
>>> p1.stdout.close()
>>> p2.communicate()
(None, None)
Run Code Online (Sandbox Code Playgroud)

我想知道为什么输出是"无",因为我已经参考了网页上的描述:http://docs.python.org/library/subprocess.html#subprocess.PIPE

我错过了代码中的一些要点吗?有什么建议/想法吗?提前致谢.

python subprocess pipe

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

用管道链接几个Popen命令

我知道如何使用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)

你能告诉我我做错了吗?

谢谢

python command subprocess pipe popen

26
推荐指数
2
解决办法
3万
查看次数

将几个子过程连在一起

我有5个进程p1,p2,...,p5,我想把一些数据写入p1的stdin,管道p1输出到p2 stdin,最后从p5的输出读取最终结果.

到目前为止我尝试了什么:

p1 = Popen(['p1'], stdin=PIPE, stdout=PIPE)
p2 = Popen(['p2'], stdin=p1.stdout, stdout=PIPE)
...
p5 = Popen(['p5'], stdin=p4.stdout, stdout=PIPE)

# write data to stdin
p1.stdin.write(indata)
p1.stdin.close()

# not sure in what order to close the pipes here, if at all

# read output
out = p5.stdout.read()
print out
Run Code Online (Sandbox Code Playgroud)

剪辑的最后一个代码只是挂起,因为我必须正确地进行读/写操作.

我能够使用communicate()两个进程来处理单个进程而无需向第一个进程提供任何输入(例如来自Python文档):

output=`dmesg | grep hda`
==>
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits. …
Run Code Online (Sandbox Code Playgroud)

python pipe

12
推荐指数
1
解决办法
5556
查看次数

如何使用子进程模块与进程正确交互

我在使用子进程模块重定向另一个程序的stdio时遇到问题.只是从stdout读取导致挂起,并且Popen.communicate()可以工作,但它在读/写后关闭管道.实现这个最简单的方法是什么?

我在Windows上玩这个:

import subprocess
proc = subprocess.Popen('python -c "while True: print \'Hi %s!\' % raw_input()"',
                        shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                        stderr=subprocess.STDOUT)
while True:
    proc.stdin.write('world\n')
    proc_read = proc.stdout.readline()
    if proc_read:
        print proc_read
Run Code Online (Sandbox Code Playgroud)

python subprocess

11
推荐指数
1
解决办法
1万
查看次数

两个子进程之间的Python管道输出

我正在研究一些通过SSH来阻止块设备的代码,我想用子进程执行此操作,以便在传输过程中监视DD的状态(使用SIGUSR1终止dd进程以获取其当前状态,并使用选择阅读).

我试图实现的命令是这样的:

dd if=/dev/sda | ssh root@example.com 'dd of=/dev/sda'
Run Code Online (Sandbox Code Playgroud)

我尝试的当前方法是:

dd_process = subprocess.Popen(['dd','if=/dev/sda'],0,None,None,subprocess.PIPE, subprocess.PIPE)  
ssh_process = subprocess.Popen(['ssh','root@example.com','dd of=/dev/sda'],0,None,dd_process.stdout)
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,SSH进程在10-40秒后就会失效.
我在这里完全是钝的,还是没有办法在像这样的子过程之间进行管道?

编辑:原来我的真实代码中没有主机名.这是做事的正确方法.

python unix subprocess

11
推荐指数
2
解决办法
1万
查看次数

Python子进程:如何使用管道三次?

我想在以下行使用子进程:

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)

你能帮助我完成第三个命令吗?

非常感谢你.

python subprocess pipe

11
推荐指数
3
解决办法
1万
查看次数

子流程中的多个管道

我试图在ruffus管道中使用Sailfish,它将多个fastq文件作为参数.我在python中使用子进程模块执行Sailfish,但是<()在子进程中调用即使在我设置时也不起作用shell=True.

这是我想用python执行的命令:

sailfish quant [options] -1 <(cat sample1a.fastq sample1b.fastq) -2 <(cat sample2a.fastq sample2b.fastq) -o [output_file]
Run Code Online (Sandbox Code Playgroud)

或(最好):

sailfish quant [options] -1 <(gunzip sample1a.fastq.gz sample1b.fastq.gz) -2 <(gunzip sample2a.fastq.gz sample2b.fastq.gz) -o [output_file]
Run Code Online (Sandbox Code Playgroud)

概括:

someprogram <(someprocess) <(someprocess)
Run Code Online (Sandbox Code Playgroud)

我将如何在python中执行此操作?子流程是正确的方法吗?

python subprocess pipe named-pipes

7
推荐指数
1
解决办法
2704
查看次数

标签 统计

python ×10

subprocess ×8

pipe ×6

bash ×1

command ×1

escaping ×1

linux ×1

named-pipes ×1

popen ×1

shell ×1

unix ×1