Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 子处理管道写入文件故障_Python_Shell_Unix_Subprocess_Pipe - Fatal编程技术网

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

Python 子处理管道写入文件故障,python,shell,unix,subprocess,pipe,Python,Shell,Unix,Subprocess,Pipe,在shell中执行此操作可以获得切实的结果: wget -O c1 --no-cache "http://some.website" | sed "1,259d" c1 | sed "4,2002d" 在Python中执行此操作对我没有任何好处: subprocess.call(shlex.split("wget -O c1 --no-cache \"http://some.website/tofile\"")) c1 = open("c1",'w') first = subprocess.P

在shell中执行此操作可以获得切实的结果:

wget -O c1 --no-cache "http://some.website" | sed "1,259d" c1 | sed "4,2002d"
在Python中执行此操作对我没有任何好处:

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()
这样做也没有任何结果:

c1.write(subprocess.Popen(shlex.split("sed \"4,2002d\""), stdin=first.stdout, stdout=subprocess.PIPE).communicate()[0])

我所说的“什么也不给我”是指文件中的空白输出。有人在这里看到了不寻常的东西吗?

为什么不在管道中执行所有操作并将输出发送到文件

wget -O - "http://www.google.com" | sed "1,259d" | sed "4,2002d" > c1
或者,如果您不想将其发送到文件,而是希望将其发送到标准输出:

wget -O - "http://www.google.com" | sed "1,259d" | sed "4,2002d"
如果您想在Python中执行此操作:

pipe = subprocess.Popen(shlex.split("wget -O - \"http://www.google.com\" | sed \"1,259d\" | sed \"4,2002d\""), stdout=subprocess.PIPE)
result = pipe.communicate()[0]

为什么不在管道中执行所有操作并将输出发送到文件

wget -O - "http://www.google.com" | sed "1,259d" | sed "4,2002d" > c1
或者,如果您不想将其发送到文件,而是希望将其发送到标准输出:

wget -O - "http://www.google.com" | sed "1,259d" | sed "4,2002d"
如果您想在Python中执行此操作:

pipe = subprocess.Popen(shlex.split("wget -O - \"http://www.google.com\" | sed \"1,259d\" | sed \"4,2002d\""), stdout=subprocess.PIPE)
result = pipe.communicate()[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
我总是使用它来运行外部命令。它提供了一个非常直观的界面,当然,还为我提供了逃逸服务

看起来像:

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
语句c1=openc1,'w'打开文件c1进行写入并截断任何现有数据,因此在调用sed之前,wget写入文件的所有内容都将被擦除

不管怎么说,我觉得shlex.split通常很尴尬。我更喜欢手动构建args列表:

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。

语句c1=openc1,“w”打开文件c1进行写入并截断任何现有数据,因此wget写入文件的所有内容都会在调用sed之前被擦除

不管怎么说,我觉得shlex.split通常很尴尬。我更喜欢手动构建args列表:

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。

为了让或多或少可能遇到同样问题的人生活得更轻松,我决定发布最终修订的代码,其中考虑了关于c1和数据覆盖的注释。特别令人感兴趣的是通信的使用,它有助于完全消除僵尸进程的任何表现形式,这非常令人恼火。此外,我发现在不需要管道的部分使用subprocess.call也很有用。最后没有必要等待。最终,远离sed和wget是一个好主意,尤其是使用Python的内置工具和urllib2


为了让或多或少可能遇到同样问题的人生活得更轻松,我决定发布最终修订的代码,其中考虑了关于c1和数据覆盖的注释。特别令人感兴趣的是通信的使用,它有助于完全消除僵尸进程的任何表现形式,这非常令人恼火。此外,我发现在不需要管道的部分使用subprocess.call也很有用。最后没有必要等待。最终,远离sed和wget是一个好主意,尤其是使用Python的内置工具和urllib2


您在Python命令行解释器中尝试过这个吗?在过程的每一步中,各种变量都显示了什么?它们是subprocess.Popen对象。当然,c1只是一个文件对象。您在Python命令行解释器中尝试过这个吗?在过程的每一步中,各种变量都显示了什么?它们是subprocess.Popen对象。当然,c1只是一个文件对象。我们能够使用您的建议的变体,它起了作用。谢谢你的帮助。我们能够使用你的建议的一个变体,并且它起了作用。谢谢你的帮助。这看起来确实是一个有用的工具,我需要试用一段时间。这确实是一个有用的工具,我需要试用一段时间。轻微修正,将p0放在外部,然后将p0放在。等一下,运行p1,不通过管道连接到p0,一切正常。是的,我意识到urllib可以完成这项工作,我只是想知道为什么它不起作用。谢谢您的建议。@eazar001:p1正在从p0获取其数据管道。我测试过了,它在我这方面起作用。然而,我确实忘记了等待。我的解决方法只是打开一个cc1并输出到它。然后运行一个进程,以简化mv cc1 c1。有点脏,但它起作用了。嗯,关于等待。发生了这种情况,我想wget需要一段时间才能完成它的工作。轻微的校正,将p0置于外部,然后将p0置于外部。在它之后,运行p1,不使用管道连接到p0,一切都正常。是的,我意识到urllib可以完成这项工作,我只是想知道为什么它不起作用。谢谢您的建议。@eazar001:p1正在从p0获取其数据管道。我测试过了,它在我这方面起作用。然而,我确实忘记了等待。我的解决方法只是打开一个cc1并输出到它。然后运行一个进程,以简化mv cc1 c1。有点脏,但我 他没有工作。嗯,关于等待。这种情况发生了,我想wget需要一段时间才能完成它的工作。