如何使脚本自动向另一个脚本提供参数而不通过命令行传递?
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"
解释我的问题的最好方法是借助示例。
考虑一个 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"
但是输入多个答案很棘手。以下内容已损坏,因为批处理解析器在每个 &
和 )
(echo val1&echo val2&echo val3)|python "script.py"
无需额外 space 即可提供多个答案的最简单方法是延迟 &
的出现,以便准备管道的初始解析过程在左侧仅看到一个 ECHO
set "+=&"
echo val1%%+%%echo val2%%+%%echo val3|python "script.py"