解释我的问题的最好方法是借助一个例子 考虑一个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脚本知道ans)而不修改Python脚本本身来处理可选的命令行参数? 我更喜欢批处理脚本的运行,好像是用户从一组变量中给脚本提供输入。
答案 0 :(得分:1)
.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")
答案 1 :(得分:0)
我认为echo 'Yes' | python QandA.py
可行。您可以按固定顺序添加多个答案,并以换行符分隔:
cat <<EOF | python QandA.py
Yes
No
Why are you asking?
EOF
对于更长时间的情况,例如必须对更改的提示作出反应,您可以使用expect
。
答案 2 :(得分:0)
单个答案的管道是微不足道的:
set ans="Yes"
cd /d "D:Automate Answers"
echo %ans%|python "QandA.py"
但是多个答案中的管道很棘手。由于批处理解析器在每个&
和)
(echo val1&echo val2&echo val3)|python "script.py"
提供多个答案而没有额外空间的最简单方法是延迟&
的外观,以便准备管道的初始解析过程只能看到左侧的一个ECHO
set "+=&"
echo val1%%+%%echo val2%%+%%echo val3|python "script.py"