在我的 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 吗?
您真的不需要为此使用 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 中完成的部分)。
我是一名优秀的程序员,十分优秀!