子进程不适用于复杂的 Unix 命令
Subprocess not working with complex Unix command
我正在尝试 运行 Python 中的 join
命令,但我被 subprocess
挫败了。我迭代地组合了数千个大文件,因此字典需要大量内存。我的理由是 join
一次只需要处理两个文件,所以我的内存开销会更低。
我尝试了很多不同的版本,试图让 subprocess
达到 运行。谁能解释为什么这不起作用?当我打印 cmd
并自己在 shell 上执行它时,它 运行 非常完美。
cmd = "join <(sort %s) <(sort %s)" % (outfile, filename)
with open(out_temp, 'w') as out:
return_code = subprocess.call(cmd, stdout=out, shell=True)
if return_code != 0:
print "not working!"
break
产生的错误如下所示。但是,当我 python 打印 cmd
并自己在 shell 上执行它时,它 运行 非常完美。
/bin/sh: -c: line 0: syntax error near unexpected token `('
我也试过将命令变成列表,但我不确定如何分解命令的基本原理是什么。谁能解释一下? outfile
和 filename
是变量
["join" , "<(sort" , outfile , ") <(sort" , filename , ")"]
如有任何帮助,我们将不胜感激!我在 Python 中这样做是因为我在上游大量解析文件名以确定要合并哪些文件。
<(
是标准 shell 语法的 bash
扩展。注意报错信息中是运行ning /bin/sh
,不是/bin/bash
;即使 /bin/sh
是 link 到 /bin/bash
,bash
在 运行 使用 link.[=19= 时也会删除它的许多扩展名]
您可以将 bash
显式地用于:
cmd = "bash -c 'join <(sort %s) <(sort %s)'" % (outfile, filename)
我正在尝试 运行 Python 中的 join
命令,但我被 subprocess
挫败了。我迭代地组合了数千个大文件,因此字典需要大量内存。我的理由是 join
一次只需要处理两个文件,所以我的内存开销会更低。
我尝试了很多不同的版本,试图让 subprocess
达到 运行。谁能解释为什么这不起作用?当我打印 cmd
并自己在 shell 上执行它时,它 运行 非常完美。
cmd = "join <(sort %s) <(sort %s)" % (outfile, filename)
with open(out_temp, 'w') as out:
return_code = subprocess.call(cmd, stdout=out, shell=True)
if return_code != 0:
print "not working!"
break
产生的错误如下所示。但是,当我 python 打印 cmd
并自己在 shell 上执行它时,它 运行 非常完美。
/bin/sh: -c: line 0: syntax error near unexpected token `('
我也试过将命令变成列表,但我不确定如何分解命令的基本原理是什么。谁能解释一下? outfile
和 filename
是变量
["join" , "<(sort" , outfile , ") <(sort" , filename , ")"]
如有任何帮助,我们将不胜感激!我在 Python 中这样做是因为我在上游大量解析文件名以确定要合并哪些文件。
<(
是标准 shell 语法的 bash
扩展。注意报错信息中是运行ning /bin/sh
,不是/bin/bash
;即使 /bin/sh
是 link 到 /bin/bash
,bash
在 运行 使用 link.[=19= 时也会删除它的许多扩展名]
您可以将 bash
显式地用于:
cmd = "bash -c 'join <(sort %s) <(sort %s)'" % (outfile, filename)