python - 如何在 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 ?
解决方案
你真的不需要 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 中完成的部分)。
推荐阅读
- react-native - 在 API 调用上反应原生屏幕导航
- android - 如何在运行时添加 texdfields 并在 android jetpack compose 中管理这些文本字段值?
- python - 导入文本文件并连续拆分值,然后将每组值分配给一个元组,然后将所有元组放在一个列表中
- json - 如何将结构反序列化/序列化为没有键的数组
- setlocale - 我是第一次使用 DeepLabCut。提取帧后,我无法加载这些帧进行标记。显示以下错误
- network-programming - 如何在没有 FCS 的情况下发送以太网帧?
- android - 不同项目/分支中的 Android Instant App
- docker - 为什么我在运行 docker ps 命令时出现错误
- sql - 根据 postgresQL 中的时间戳将值从一个表映射到另一个表
- android - 如何更改我的 android 应用程序的内容