如何将 python 变量读入 bash 命令

How to read python variables into bash command

我正在编写脚本以使用 Python 2.6 生成 Autosys 报告,我想将变量从 python 脚本传递到 bash 命令:

我有 3 个变量:

下个月, NDNextMonth, 年份

当我使用带有 1 个变量的命令时,它工作正常。

    env = os.environ.copy()
env['NextMonth'] = NextMonth
subprocess.call('forecast -J *JobABC_* -M ALL -F "${NextMonth}/01/2020 00:00" -T "${NextMonth}/31/2020 23:59" -h -n > PythonReport1.txt', env=env, shell=True)

反之则不行,日期无效:

    env = os.environ.copy()
env['NextMonth'] = NextMonth
env['NDNextMonth'] = NDNextMonth
env['Year'] = Year
subprocess.call('forecast -J *JobABC_* -M ALL -F "${NextMonth}/01/${Year}" 00:00" -T "${NextMonth}/${NDNextMonth}/${Year}" 23:59" -h -n > PythonReport1.txt',env=env, shell=True)

你能检查一下,如何将这 3 个变量读入命令吗? 错误:类型错误:execve() arg 3 包含非字符串值

正如评论中指出的那样,您的变量工作正常;问题是你在字符串中有虚假的双引号。

subprocess.call('forecast -J *JobABC_* -M ALL'
    ' -F "${NextMonth}/01/${Year} 00:00"'
    ' -T "${NextMonth}/${NDNextMonth}/${Year} 23:59"'
    ' -h -n > PythonReport1.txt',
    env=env, shell=True)

请注意在 ${Year} 的任一实例之后没有结束双引号,因为字符串并未在那里结束。

顺便说一句,大括号在这里不是特别有用;你也可以使用 $Year 等。但是如果你的任务只是将这些值从 Python 传递到 shell,就这样做,使用任何 Python 字符串插值机制你觉得舒服;

subprocess.call('forecast -J *JobABC_* -M ALL'
    ' -F "{0}/01/{2} 00:00"'
    ' -T "{0}/{1}/{2} 23:59"'
    ' -h -n > PythonReport1.txt'.format(NextMonth, NDNextMonth, Year),
    shell=True)

更好的解决方案是完全避免 shell。此外,可能使用 check_call 而不是普通的 call。进一步了解 Running Bash commands in Python.

import glob
with open('PythonReport1.txt', 'w') as handle:
    subprocess.check_call(['forecast', '-J'] + glob.glob('*JobABC_*') +
        ['-M', 'ALL', '-F', "{0}/01/{1} 00:00".format(NextMonth, Year),
         '-T', "{0}/{1}/{2} 23:59".format(NextMonth, NDNextMonth, Year),
         '-h', '-n'], stdout=handle)