我想subprocess.check_output()用ps -A | grep 'process_name'.我尝试了各种解决方案,但到目前为止没有任 有人可以指导我怎么做吗?
使用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中进行比特币支付.在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中执行以下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
我错过了代码中的一些要点吗?有什么建议/想法吗?提前致谢.
我知道如何使用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)
你能告诉我我做错了吗?
谢谢
我有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) 我在使用子进程模块重定向另一个程序的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_readRun Code Online (Sandbox Code Playgroud) 我正在研究一些通过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秒后就会失效.
我在这里完全是钝的,还是没有办法在像这样的子过程之间进行管道?
编辑:原来我的真实代码中没有主机名.这是做事的正确方法.
我想在以下行使用子进程:
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)
你能帮助我完成第三个命令吗?
非常感谢你.
我试图在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中执行此操作?子流程是正确的方法吗?