python: 使用子进程调用 shell 命令
python: calling shell command with subprocess
我正在使用 subprocess.call
从 python
(2.7.3) 函数调用 mencoder
(我正在使用 ipython
),但它不起作用,而当我在终端 shell 上复制并粘贴命令时,它确实如此。我想我在使用字符串时犯了一些愚蠢的错误。我很困惑,因为我在两个不同的计算集群上 运行 这个 python
函数,具有相同的 python
版本,但 mencoder
的不同版本,并且这个命令适用于一个群集但不在另一个上。
这是 python
脚本
base = r'/home/afylot/pics/'
var = r'b2component'
os.chdir(base)
listdir = [x[0] for x in os.walk('.')][1:-1]
listdir.reverse()
dirs = ','.join(listdir)
dirs2=dirs.replace(r"./z",r"")
def cmd2(x): return r"mencoder mf://z{"+dirs2+"}/"+x+r".png -mf fps=1 -ovc lavc -o "+x+r"_mpeg4.avi"
def cmd3(x): return r"mencoder -speed 1/4 "+x+r"_mpeg4.avi -ovc copy -nosound -o "+x+r"_smpeg4.avi"
res2=subprocess.call([cmd2(var)],shell=True)
res3=subprocess.call([cmd3(var)],shell=True)
这是错误信息:
MEncoder SVN-r37381-4.6 (C) 2000-2015 MPlayer Team
success: format: 16 data: 0x0 - 0x0
MF file format detected.
[mf] filelist: z{5.056,4.996,4.936,4.877,4.819,4.762,4.705,4.648,4.592,4.537,4.482,4.428,4.374,4.321,4.268,4.216,4.164,4.113,4.063,4.012,3.963,3.914,3.865,3.817,3.769,3.722,3.675,3.629,3.583,3.538,3.493,3.448,3.404,3.361,3.317,3.275,3.232,3.190,3.149,3.108,3.067,3.027,2.987,2.909,2.870,2.832,2.794,2.756,2.719,2.682,2.646,2.609,2.574,2.538,2.503,2.469,2.434,2.400,2.367,2.333,2.300,2.268,2.235,2.203,2.171,2.140,2.109,2.078,2.048}/b2component.png
[mf] number of files: 0
Segmentation fault (core dumped)
MEncoder SVN-r37381-4.6 (C) 2000-2015 MPlayer Team
File not found: 'b2component_mpeg4.avi'
Failed to open b2component_mpeg4.avi.
Cannot open file/device.
Exiting...
在另一个集群上,python
函数中的命令有效。如果在同一个集群上,我尝试从终端启动命令,它也有效
mencoder mf://z{5.056,4.996,4.936,4.877,4.819,4.762,4.705,4.648,4.592,4.537,4.482,4.428,4.374,4.321,4.268,4.216,4.164,4.113,4.063,4.012,3.963,3.914,3.865,3.817,3.769,3.722,3.675,3.629,3.583,3.538,3.493,3.448,3.404,3.361,3.317,3.275,3.232,3.190,3.149,3.108,3.067,3.027,2.987,2.909,2.870,2.832,2.794,2.756,2.719,2.682,2.646,2.609,2.574,2.538,2.503,2.469,2.434,2.400,2.367,2.333,2.300,2.268,2.235,2.203,2.171,2.140,2.109,2.078,2.048}/b2component.png -mf fps=1 -ovc lavc -o b2component_mpeg4.avi
在群集 A 上,python
函数失败,我有 bash
4.2.25。
在 python
函数起作用的群集 B 上,我是 运行 tcsh
6.17.00
我用通配符(如 *
和 ?
)测试了相同的命令,它在 python 函数中运行。问题出在大括号 {}
上。有趣的是,在集群 B 上,即 运行 tcsh
,通配符不起作用,但大括号起作用!
有人可以建议如何用牙套克服这个限制吗?因为我想从 python 函数中控制 dirs2 的顺序,所以使用 *
不会做我想要的。
问题与 Curly Braces in python Popen 中的相同
,解决方案是使用
subprocess.call(cmd2(v), shell=True, executable='/bin/bash')
否则 shell=True
运行 /bin/sh
我正在使用 subprocess.call
从 python
(2.7.3) 函数调用 mencoder
(我正在使用 ipython
),但它不起作用,而当我在终端 shell 上复制并粘贴命令时,它确实如此。我想我在使用字符串时犯了一些愚蠢的错误。我很困惑,因为我在两个不同的计算集群上 运行 这个 python
函数,具有相同的 python
版本,但 mencoder
的不同版本,并且这个命令适用于一个群集但不在另一个上。
这是 python
脚本
base = r'/home/afylot/pics/'
var = r'b2component'
os.chdir(base)
listdir = [x[0] for x in os.walk('.')][1:-1]
listdir.reverse()
dirs = ','.join(listdir)
dirs2=dirs.replace(r"./z",r"")
def cmd2(x): return r"mencoder mf://z{"+dirs2+"}/"+x+r".png -mf fps=1 -ovc lavc -o "+x+r"_mpeg4.avi"
def cmd3(x): return r"mencoder -speed 1/4 "+x+r"_mpeg4.avi -ovc copy -nosound -o "+x+r"_smpeg4.avi"
res2=subprocess.call([cmd2(var)],shell=True)
res3=subprocess.call([cmd3(var)],shell=True)
这是错误信息:
MEncoder SVN-r37381-4.6 (C) 2000-2015 MPlayer Team
success: format: 16 data: 0x0 - 0x0
MF file format detected.
[mf] filelist: z{5.056,4.996,4.936,4.877,4.819,4.762,4.705,4.648,4.592,4.537,4.482,4.428,4.374,4.321,4.268,4.216,4.164,4.113,4.063,4.012,3.963,3.914,3.865,3.817,3.769,3.722,3.675,3.629,3.583,3.538,3.493,3.448,3.404,3.361,3.317,3.275,3.232,3.190,3.149,3.108,3.067,3.027,2.987,2.909,2.870,2.832,2.794,2.756,2.719,2.682,2.646,2.609,2.574,2.538,2.503,2.469,2.434,2.400,2.367,2.333,2.300,2.268,2.235,2.203,2.171,2.140,2.109,2.078,2.048}/b2component.png
[mf] number of files: 0
Segmentation fault (core dumped)
MEncoder SVN-r37381-4.6 (C) 2000-2015 MPlayer Team
File not found: 'b2component_mpeg4.avi'
Failed to open b2component_mpeg4.avi.
Cannot open file/device.
Exiting...
在另一个集群上,python
函数中的命令有效。如果在同一个集群上,我尝试从终端启动命令,它也有效
mencoder mf://z{5.056,4.996,4.936,4.877,4.819,4.762,4.705,4.648,4.592,4.537,4.482,4.428,4.374,4.321,4.268,4.216,4.164,4.113,4.063,4.012,3.963,3.914,3.865,3.817,3.769,3.722,3.675,3.629,3.583,3.538,3.493,3.448,3.404,3.361,3.317,3.275,3.232,3.190,3.149,3.108,3.067,3.027,2.987,2.909,2.870,2.832,2.794,2.756,2.719,2.682,2.646,2.609,2.574,2.538,2.503,2.469,2.434,2.400,2.367,2.333,2.300,2.268,2.235,2.203,2.171,2.140,2.109,2.078,2.048}/b2component.png -mf fps=1 -ovc lavc -o b2component_mpeg4.avi
在群集 A 上,python
函数失败,我有 bash
4.2.25。
在 python
函数起作用的群集 B 上,我是 运行 tcsh
6.17.00
我用通配符(如 *
和 ?
)测试了相同的命令,它在 python 函数中运行。问题出在大括号 {}
上。有趣的是,在集群 B 上,即 运行 tcsh
,通配符不起作用,但大括号起作用!
有人可以建议如何用牙套克服这个限制吗?因为我想从 python 函数中控制 dirs2 的顺序,所以使用 *
不会做我想要的。
问题与 Curly Braces in python Popen 中的相同 ,解决方案是使用
subprocess.call(cmd2(v), shell=True, executable='/bin/bash')
否则 shell=True
运行 /bin/sh