如何用python subprocess调用LC_ALL=C sort -k1 file -o file?
当我尝试时:subprocess.check_call(["LC_ALL=C sort -k1 {} -o {}".format(file,file)])
出现以下错误:FileNotFoundError: [Errno 2] No such file or directory: 'LC_ALL=C sort -k1 file.txt -o file.txt'
发布于 2018-07-12 04:12:47
语法var=value command是用于设置环境变量和运行命令的外壳语法。默认情况下,subprocess不提供外壳(虽然您可以使用shell=True获得一个外壳,但如果可以,您通常应该尽量避免这种情况)。在Python语言中,实现这一点的方法是使用env传入变量字典。
myenv = os.environ.copy()
myenv['LC_ALL'] = 'C'
subprocess.check_call(['sort', '-k1', file, '-o', file], env=myenv)Python完全能够在内部对一系列行进行排序;完全避免外部进程是一个更好的解决方案。
发布于 2018-07-12 04:11:22
赋值是shell语法。
如果没有设置shell=True,就没有shell,因此没有任何东西可用来解析和执行赋值。
仅仅设置shell=True就会导致安全错误。
如果您的文件名包含$(rm -rf ~),使用''.format()注入它是危险的。
因此生成一个值为C、添加了LC_ALL的环境
sort_env = os.environ.copy()
sort_env['LC_ALL'] = 'C'
subprocess.check_call(['sort', '-k1', file, '-o', file], env=sort_env)或者使用shell=True,但在带外传递参数:
当列表传递给shell=True时,第一个元素被视为要解释的脚本;第二个元素在该脚本的上下文中被视为$0;第三个元素被视为$1,依此类推:
subprocess.check_call(['LC_ALL=C sort -k1 "$1" -o "$2"', '_', file, file])发布于 2018-07-12 04:16:31
将环境变量的字典作为env kwarg传递给the subprocess invocation。
Python 2.7.14 (default, Mar 22 2018, 14:43:05)
In [1]: import subprocess
In [2]: subprocess.check_call(["env"], env={'LC_ALL': 'C'})
LC_ALL=Chttps://stackoverflow.com/questions/51293480
复制相似问题