当包装在.bat文件中时,使raw_input()可以使用管道和参数

时间:2014-02-07 02:18:04

标签: python batch-file

我想在python代码周围写一个.bat包装器,它可以处理参数和管道输入。参数没有问题,但是一旦我尝试管道输入,我就失去了使用raw_input查询用户和/或导致EOFError的能力。以下是一个示例,我们称之为 test.bat 。我可以改变下面的脚本让它处理管道输入和参数输入吗?

[编辑]感谢Harry Johnston提出的建议,请参阅下面的代码,了解使用管道和参数获取用户输入的坚如磐石的方法!

@echo off
rem = """
setlocal enableextensions
set PYTHON="C:/Python27/python.exe"
%PYTHON% -x "%~f0" %*
goto endofPython """


import os, stat, sys

# This effectively replaces raw_input()
def workaround(message):
    while True:
        sys.stdout.write(message)
        answer = ''
        with open('CON') as console:
            answer = console.readline().lower().strip()

        if answer == 'y' or answer == 'yes':
            return True
        elif answer == 'n' or answer == 'no':
            return False

mode = os.fstat(0).st_mode
if stat.S_ISFIFO(mode) or stat.S_ISREG(mode):
    print
    if workaround("Print STDIN? ([Y]es,[N]o)"):
        print
        print
        for x in sys.stdin:
            print 'STDIN: %s'%x.strip()

if sys.argv[1:]:
    print
    if workaround("Print ARGV? ([Y]es,[N]o)"):
        print
        for x in sys.argv[1:]:
            print 'ARGV : %s'%x

rem = """
:endofPython """

1 个答案:

答案 0 :(得分:2)

在Windows上,您可以使用open('CON')创建一个文件对象,用于从控制台读取数据(即绕过标准输入重定向)。