首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python子进程中调用LC_ALL=C sort

如何在Python子进程中调用LC_ALL=C sort
EN

Stack Overflow用户
提问于 2018-07-12 04:07:30
回答 3查看 513关注 0票数 1

如何用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'

EN

回答 3

Stack Overflow用户

发布于 2018-07-12 04:12:47

语法var=value command是用于设置环境变量和运行命令的外壳语法。默认情况下,subprocess不提供外壳(虽然您可以使用shell=True获得一个外壳,但如果可以,您通常应该尽量避免这种情况)。在Python语言中,实现这一点的方法是使用env传入变量字典。

代码语言:javascript
复制
myenv = os.environ.copy()
myenv['LC_ALL'] = 'C'
subprocess.check_call(['sort', '-k1', file, '-o', file], env=myenv)

Python完全能够在内部对一系列行进行排序;完全避免外部进程是一个更好的解决方案。

票数 4
EN

Stack Overflow用户

发布于 2018-07-12 04:11:22

赋值是shell语法。

如果没有设置shell=True,就没有shell,因此没有任何东西可用来解析和执行赋值。

仅仅设置shell=True就会导致安全错误。

如果您的文件名包含$(rm -rf ~),使用''.format()注入它是危险的。

因此生成一个值为C、添加了LC_ALL的环境

代码语言:javascript
复制
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,依此类推:

代码语言:javascript
复制
subprocess.check_call(['LC_ALL=C sort -k1 "$1" -o "$2"', '_', file, file])
票数 3
EN

Stack Overflow用户

发布于 2018-07-12 04:16:31

将环境变量的字典作为env kwarg传递给the subprocess invocation

代码语言:javascript
复制
    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=C
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51293480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档