将带有变量的bash命令作为python子进程运行

2024-05-14 03:52:21 发布

您现在位置: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')

Tags: docker字符串命令envconfigjsonconfit
1条回答
网友
1楼 · 发布于 2024-05-14 03:52:21

您得到“未找到文件”是因为(没有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

相关问题 更多 >