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

时间:2015-02-14 18:58:04

标签: python batch-file

解释我的问题的最好方法是借助一个例子 考虑一个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脚本本身来处理可选的命令行参数? 我更喜欢批处理脚本的运行,好像是用户从一组变量中给脚本提供输入。

3 个答案:

答案 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"