我正在尝试在 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 print cmd
并在 shell 上自己执行它时,它运行得很好。
/bin/sh: -c: line 0: syntax error near unexpected token `('
我也尝试过将命令转换为列表,但我不确定如何分解命令的基本原理是什么。谁能解释一下吗? outfile
和 filename
是变量
["join" , "<(sort" , outfile , ") <(sort" , filename , ")"]
如有任何帮助,我们将不胜感激!我在 Python 中执行此操作是因为我要大量解析上游文件名以找出要组合的文件。
最佳答案
<(
是 bash
标准 shell 语法的扩展。请注意错误消息中它正在运行 /bin/sh
,不是/bin/bash
;即使/bin/sh
是 /bin/bash
的链接, bash
使用该链接运行时会删除许多扩展。
您可以使用bash
明确地:
cmd = "bash -c 'join <(sort %s) <(sort %s)'" % (outfile, filename)
关于python - 子进程无法使用复杂的 Unix 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39060644/