如何使脚本自动向另一个脚本提供参数而不通过命令行传递?

How to make a script auto-provide arguments to another without passing via command line?

解释我的问题的最好方法是借助示例。
考虑一个 Python 脚本,它提出一个问题并根据问题给出答案。

QandA.py

import os,sys,re

ans = input('How you doin\' \(Say Yes\/No\)')
if (ans == "Yes"):
   print("Nice to hear")
elif (ans == "No") :
   print("Oh Too Bad")

上面的脚本通常会提示用户输入,但我也希望它被批处理脚本调用,该批处理脚本将为被调用的 Python 脚本提供输入。 我将在批处理文件本身中对这些输入进行硬编码(如下所示)。

call.bat

set ans="Yes"
D:
cd "Automate Answers"
python "QandA.py"

有没有什么方法可以在不修改 Python 脚本本身来处理可选的命令行参数的情况下实现这一点(让 Python 脚本知道 ans)? 与 运行 相比,我更喜欢批处理脚本,就好像它是用户从变量数组向脚本提供输入一样。

.bat.cmd 中设置的变量应显示为环境变量。 Python 可以读取通过 os.environ

传入的 环境变量
import os
print(os.environ['ans'])

因此你可以这样写:

import os

ans = os.environ.get('ans')
if ans is None:  # it was not set, so ask user
    ans = input("How you doin' (Say Yes/No)")

if ans == "Yes":
    print("Nice to hear")
elif ans == "No":
    print("Oh Too Bad")

甚至做一个功能:

def env_or_input(var_name, prompt):
    val = os.environ.get(var_name)
    if val is None:  # it was not set, so ask user
        val = input(prompt)
    return val

...

ans = env_or_input("ans", "How you doin' (Say Yes/No)")
if ans == "Yes":
    print("Nice to hear")
elif ans == "No":
    print("Oh Too Bad")

我想 echo 'Yes' | python QandA.py 可以。您可以按固定顺序添加多个答案,以换行符分隔:

cat <<EOF | python QandA.py
Yes
No
Why are you asking?
EOF

对于更长的场景,例如必须对不断变化的提示做出反应,您可以使用 expect.

在单个答案中使用管道是微不足道的:

set ans="Yes"
cd /d "D:Automate Answers"
echo %ans%|python "QandA.py"

但是输入多个答案很棘手。以下内容已损坏,因为批处理解析器在每个 &)

之前插入了一个额外的 space
(echo val1&echo val2&echo val3)|python "script.py"

无需额外 space 即可提供多个答案的最简单方法是延迟 & 的出现,以便准备管道的初始解析过程在左侧仅看到一个 ECHO

set "+=&"
echo val1%%+%%echo val2%%+%%echo val3|python "script.py"