首页 > 解决方案 > 如何在 python 中使用带有 python 函数的 linux 命令 (sys.argv)

问题描述

在我的 python 脚本中,我需要使用 'awk' 但我想使用 sys.argv 传递文件。我当前的代码是这样的:

import sys
import os

cmd="awk '/regex/ {print}' sys.argv[1] | sed 's/old/new/g'"
x=os.popen(cmd).read()

现在的问题是 'sys.argv' 是 python 的东西,但 cmd 变量使用的是 linux 命令。所以我的问题是 - 有没有办法在我的 linux 命令中包含 sys.argv ?

标签: pythonbash

解决方案


你真的不需要 Awk 或sed为此。Python 可以原生、优雅、灵活、健壮、自然地完成这些事情。

import sys
import re

r = re.compile(r'regex')
s = re.compile(r'old')

with open(sys.argv[1]) as input:
    for line in input:
        if r.search(line):
            print(s.sub('new', line))

如果您真的想将子进程用于某些事情,只需使用 Python 的通用字符串插值函数,您需要将 Python 变量的值插入到字符串中。

import subprocess
import sys
import shlex

result = subprocess.run(
    """awk '/regex/ {print}' {} | 
    sed 's/old/new/g'""".format(shlex.quote(sys.argv[1])),
    stdout=subprocess.PIPE,
    shell=True, check=True)
print(subprocess.stdout)

但真的,不要这样做。如果您确实无法避免子流程,请使其尽可能简单(避免shell=True并剥离所有可以在 Python 中完成的部分)。


推荐阅读