首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >子处理管道写入文件故障

子处理管道写入文件故障
EN

Stack Overflow用户
提问于 2013-03-14 13:26:18
回答 4查看 312关注 0票数 1

在shell中执行此命令会得到实际的结果:

代码语言:javascript
代码运行次数:0
运行
复制
wget -O c1 --no-cache "http://some.website" | sed "1,259d" c1 | sed "4,2002d"

在Python中这样做不会给我带来任何好处:

代码语言:javascript
代码运行次数:0
运行
复制
subprocess.call(shlex.split("wget -O c1 --no-cache \"http://some.website/tofile\""))
c1 = open("c1",'w')
first = subprocess.Popen(shlex.split("sed \"1,259d\" c1"), stdout=subprocess.PIPE)

subprocess.Popen(shlex.split("sed \"4,2002d\""), stdin=first.stdout, stdout=c1)
c1.close()

这样做也不会得到任何结果:

代码语言:javascript
代码运行次数:0
运行
复制
c1.write(subprocess.Popen(shlex.split("sed \"4,2002d\""), stdin=first.stdout, stdout=subprocess.PIPE).communicate()[0])

所谓“一无所获”,我指的是文件中的空白输出。有没有人看到什么不寻常的东西?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-14 16:47:44

语句c1 = open("c1",'w')打开文件c1进行写入,并截断任何现有数据,因此在调用sed之前,写入该文件的所有wget都会被擦除。

无论如何,我认为shlex.split通常是笨拙的。我更喜欢手动构建args列表:

代码语言:javascript
代码运行次数:0
运行
复制
from subprocess import Popen, PIPE

p0 = Popen(['wget', '-O', '-', 'http://www.google.com'], stdout=PIPE)
p1 = Popen(['sed', '2,8d'], stdin=p0.stdout, stdout=PIPE) 
with open('c1', 'w') as c1:
    p2 = Popen(['sed', '2,7d'], stdin=p1.stdout, stdout=c1)
    p2.wait()

但是,Python程序员没有明显的理由必须调用sed。Python有字符串方法和正则表达式。此外,您可以使用urllib2.urlopen而不是wget。

票数 2
EN

Stack Overflow用户

发布于 2013-03-14 14:46:15

我总是使用plumbum来运行外部命令。它提供了一个非常直观的界面,当然,也为我提供了转义功能。

看起来像这样:

代码语言:javascript
代码运行次数:0
运行
复制
from plumbum.cmd import wget, sed
cmd1 = wget['-O', 'c1']['--no-cache']["http://some.website"]
cmd2 = sed["1,259d"]['c1'] | sed["4,2002d"]
print cmd1
cmd1()  # run it
print cmd2
cmd2()  # run it
票数 3
EN

Stack Overflow用户

发布于 2013-03-14 14:18:52

为什么不在管道中做所有的事情并将输出发送到一个文件中呢?

代码语言:javascript
代码运行次数:0
运行
复制
wget -O - "http://www.google.com" | sed "1,259d" | sed "4,2002d" > c1

或者,如果您不想将其发送到文件,而希望将其放在stdout上:

代码语言:javascript
代码运行次数:0
运行
复制
wget -O - "http://www.google.com" | sed "1,259d" | sed "4,2002d"

如果你想用Python做这件事:

代码语言:javascript
代码运行次数:0
运行
复制
pipe = subprocess.Popen(shlex.split("wget -O - \"http://www.google.com\" | sed \"1,259d\" | sed \"4,2002d\""), stdout=subprocess.PIPE)
result = pipe.communicate()[0]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15401836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档