我需要使用带有python 子进程模块的标准UNIX diff命令创建一个diff文件.问题是我必须比较文件和流而不创建tempopary文件.我想过通过os.mkfifo方法使用命名管道,但没有达到任何好结果.请问,你能写一个关于如何解决这个问题的简单例子吗?我试过这样:
fifo = 'pipe'
os.mkfifo(fifo)
op = popen('cat ', fifo)
print >> open(fifo, 'w'), output
os.unlink(fifo)
proc = Popen(['diff', '-u', dumpfile], stdin=op, stdout=PIPE)
Run Code Online (Sandbox Code Playgroud)
但似乎diff没有看到第二个论点.
这不是我第一次遇到这个问题,这真的让我烦恼.每当我使用Python subprocess模块打开管道时,我只能communicate使用它一次,因为文档指定:Read data from stdout and stderr, until end-of-file is reached
proc = sub.Popen("psql -h darwin -d main_db".split(),stdin=sub.PIPE,stdout=sub.PIPE)
print proc.communicate("select a,b,result from experiment_1412;\n")[0]
print proc.communicate("select theta,zeta,result from experiment_2099\n")[0]
Run Code Online (Sandbox Code Playgroud)
这里的问题是,第二次,Python并不开心.实际上,他决定在第一次沟通后关闭文件:
Traceback (most recent call last):
File "a.py", line 30, in <module>
print proc.communicate("select theta,zeta,result from experiment_2099\n")[0]
File "/usr/lib64/python2.5/subprocess.py", line 667, in communicate
return self._communicate(input)
File "/usr/lib64/python2.5/subprocess.py", line 1124, in _communicate
self.stdin.flush()
ValueError: I/O operation on closed file
Run Code Online (Sandbox Code Playgroud)
是否允许多次通信?
有没有一种很好的方法可以在不使用磁盘的情况下在两个python子进程之间传递大量数据?这是我希望完成的动画示例:
import sys, subprocess, numpy
cmdString = """
import sys, numpy
done = False
while not done:
cmd = raw_input()
if cmd == 'done':
done = True
elif cmd == 'data':
##Fake data. In real life, get data from hardware.
data = numpy.zeros(1000000, dtype=numpy.uint8)
data.dump('data.pkl')
sys.stdout.write('data.pkl' + '\\n')
sys.stdout.flush()"""
proc = subprocess.Popen( #python vs. pythonw on Windows?
[sys.executable, '-c %s'%cmdString],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
for i in range(3):
proc.stdin.write('data\n')
print proc.stdout.readline().rstrip()
a = numpy.load('data.pkl')
print a.shape
proc.stdin.write('done\n')
Run Code Online (Sandbox Code Playgroud)
这将创建一个子进程,该子进程生成numpy数组并将数组保存到磁盘.然后父进程从磁盘加载数组.有用!
问题是,我们的硬件可以生成比磁盘可读/写快10倍的数据.有没有办法将数据从一个python进程传输到另一个纯内存中,甚至可能没有复制数据?我可以做一些像传递参考的东西吗?
我第一次尝试纯粹在内存中传输数据是非常糟糕的:
import …Run Code Online (Sandbox Code Playgroud) 我知道如何使用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)
你能告诉我我做错了吗?
谢谢
如何使用子进程模块运行bash脚本,我必须给出几个参数?
这就是我目前使用的:
subprocess.Popen(['/my/file/path/programname.sh', 'arg1 arg2 %s' % arg3], \
shell = True)
Run Code Online (Sandbox Code Playgroud)
bash脚本似乎没有采用任何参数.任何见解都非常感谢!
我了解到在Python中执行命令时,我应该使用子进程.我想要实现的是通过ffmpeg编码文件并观察程序输出直到文件完成.Ffmpeg将进度记录到stderr.
如果我尝试这样的事情:
child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE)
complete = False
while not complete:
stderr = child.communicate()
# Get progress
print "Progress here later"
if child.poll() is not None:
complete = True
time.sleep(2)
Run Code Online (Sandbox Code Playgroud)
调用child.communicate()并等待命令完成后,程序不会继续.还有其他方法可以跟随输出吗?
这是我的问题:我在HDFS中有一个文件可能很大(=不足以满足所有内存)
我想要做的是避免将此文件缓存在内存中,并且只像我对常规文件那样逐行处理:
for line in open("myfile", "r"):
# do some processing
Run Code Online (Sandbox Code Playgroud)
我希望看看是否有一种简单的方法可以在不使用外部库的情况下完成这项工作.我大概可以使其与工作libpyhdfs或蟒蛇,HDFS,但我想如果可能的话,以避免在系统中引入新的依赖和未经考验的库,特别是因为这两个似乎没有大量维护和状态,他们不应该用于生产.
我想做到这一点使用标准的"Hadoop的"命令行工具,使用Python subprocess模块,但我似乎无法能够做什么,我需要的,因为没有命令行工具,会做我处理,我想以流方式为每一行执行Python函数.
有没有办法使用子进程模块将Python函数应用为管道的正确操作数?或者甚至更好,打开它就像一个文件作为生成器,所以我可以轻松处理每一行?
cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
如果有另一种方法可以在不使用外部库的情况下实现上述描述,我也非常开放.
谢谢你的帮助 !
我试图在中央服务器上运行模拟(用python编写),当模拟完成后,通过连接到我的本地PC将保存的图形文件/保存的数据文件移动到我的本地PC.代码如下:
import matplotlib.pyplot as plt
import subprocess
import scipy.io
import os
#Save data file:
scipy.io.savemat(data_path + Filename_str, dict(A=board))
#Create / Save figure by using imshow (Heatmap)
p = plt.imshow(mean_map.T, cmap = plt.cm.gist_yarg_r, origin = 'lower', extent = [0, phi, 0, Z], aspect='auto')
plt.savefig(figure_path + Filename_str + '-Homophily.pdf')
# Connect to my local host (arabian-knights) using ssh, and follow command.
ret = subprocess.call(['ssh', 'arabian-knights', 'mv Data/* /scratch/Data/'])
ret = subprocess.call(['ssh', 'arabian-knights', 'mv Figure/* /scratch/Figure/'])
Run Code Online (Sandbox Code Playgroud)
我从本地计算机(阿拉伯骑士)连接到服务器计算机后,在服务器计算机的后台运行此模拟.即使我关闭与服务器计算机的连接,因为模拟在后台运行,它不会停止,并且模拟完成后数据文件正确地移动到我的本地计算机.但是,不保存图文件(由matplotlib.pyplot.imshow生成),显示以下错误消息:
Traceback (most recent call …Run Code Online (Sandbox Code Playgroud) 我想检查子进程是否已成功执行或失败.目前我已经提出了一个解决方案,但我不确定它是否正确可靠.是否保证每个进程仅向stderr输出其错误stdout:
注意:我对重定向/打印输出不感兴趣.我知道该怎么做.
pipe = subprocess.Popen(command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True)
if "" == pipe.stdout.readline():
print("Success")
self.isCommandExectutionSuccessful = True
if not "" == pipe.stderr.readline():
print("Error")
self.isCommandExectutionSuccessful = True
Run Code Online (Sandbox Code Playgroud)
或者:
if "" == pipe.stdout.readline():
print("Success")
self.isCommandExectutionSuccessful = True
else:
print("Error")
self.isCommandExectutionSuccessful = False
Run Code Online (Sandbox Code Playgroud)
和:
if not "" == pipe.stderr.readline():
print("Success")
self.isCommandExectutionSuccessful = True
else:
print("Error")
self.isCommandExectutionSuccessful = False
Run Code Online (Sandbox Code Playgroud) 我已经使用subprocess.check_output()了一段时间来捕获子进程的输出,但在某些情况下遇到了一些性能问题.我在RHEL6机器上运行它.
调用Python环境是linux编译的64位.我正在执行的子进程是一个shell脚本,最终通过Wine触发Windows python.exe进程(为什么这个愚蠢是另一个故事).作为shell脚本的输入,我在一小段Python代码中输入了传递给python.exe的代码.
虽然系统处于中等/重负载(CPU利用率为40%到70%),但我注意到subprocess.check_output(cmd, shell=True)在check_output命令返回之前,子进程完成执行后,使用会导致显着延迟(最多约45秒).ps -efH在此期间查看输出显示被调用的子进程sh <defunct>,直到它最终返回正常的零退出状态.
相反,使用subprocess.call(cmd, shell=True)在相同的中/重负载下运行相同的命令将导致子进程立即返回而没有延迟,所有输出都打印到STDOUT/STDERR(而不是从函数调用返回).
为什么只有在check_output()将STDOUT/STDERR输出重定向到其返回值时才有这么大的延迟,而不是call()只是将它打印回父代的STDOUT/STDERR?