python - 运行带有变量的 bash 命令作为 python 子进程
问题描述
我有这个shell命令:
$ docker run -it --env-file=.env -e "CONFIG=$(cat /path/to/your/config.json | jq -r tostring)" algolia/docsearch-scraper
我想将它作为 python 子进程运行。我以为我只需要一个等价的jq -r tostring
,但是如果我将 config.json 用作普通字符串,则 " 不会被转义。我还使用 json.load(config.json) 对它们进行了转义。与原始jq 命令 " 也不要转义,它只是返回 json 字符串。
当我在 python 子进程中使用作为字符串返回的 json 时,我总是在子进程行上得到一个 FileNotFoundError 。
@main.command()
def algolia_scrape():
with open(f"{WORKING_DIR}/conf_dev.json") as conf:
CONFIG = json.load(conf)
subprocess.Popen(f'/usr/local/bin/docker -it --env-file={WORKING_DIR}/algolia.env -e "CONFIG={json.dumps(CONFIG)}" algolia/docsearch-scraper')
解决方案
你得到“找不到文件”,因为(没有shell=True
)你试图运行一个命令,它的名字是/usr/local/bin/docker -it ...
你想/usr/local/bin/docker
用一些参数运行的时候。当然,尝试通过 shell 传递 JSON 几乎是一场噩梦,因为您需要从字符串中转义任何 shell 元字符;但只需将命令字符串分解为字符串列表,就像 shell 那样。
def algolia_scrape():
with open(f"{WORKING_DIR}/conf_dev.json") as conf:
CONFIG = json.load(conf)
p = subprocess.Popen(['/usr/local/bin/docker', '-it',
f'--env-file={WORKING_DIR}/algolia.env',
'-e', f'CONFIG={json.dumps(CONFIG)}',
'algolia/docsearch-scraper'])
您通常希望保存结果,subprocess.Popen()
因为wait
当进程终止时您需要保存结果。
推荐阅读
- python - Python - POST上传的csv文件上的CSV嗅探器
- vb.net - 如何在另一个声音已经播放时播放声音 - VB.NET 2010
- php - Laravel 正则表达式验证防止特殊字符
- sql - 如何使用复合键连接多个表
- python - 我收到了这个错误——IndexError: list index out of range
- hyperledger-fabric - Hyperledger:引导网络时的证书问题
- java - 如何在Java中将图标放在整个JButton上
- security - MarkLogic Element Security,从模糊到清晰
- javascript - React Native Webview - 如何实现滚动到顶部按钮?
- python - 处理 Django 模型时出现操作错误