diff --git a/Lib/argparse.py b/Lib/argparse.py --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1151,16 +1151,18 @@ # the special argument "-" means sys.std{in,out} if string == '-': if 'r' in self._mode: - return _sys.stdin + file = _sys.stdin.fileno() elif 'w' in self._mode: - return _sys.stdout + file = _sys.stdout.fileno() else: msg = _('argument "-" with mode %r') % self._mode raise ValueError(msg) + else: + file = string # all other arguments are used as file names try: - return open(string, self._mode, self._bufsize) + return open(file, self._mode, self._bufsize) except IOError as e: message = _("can't open '%s': %s") raise ArgumentTypeError(message % (string, e)) diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -1439,6 +1439,19 @@ return self.name == other.name == text +class FilenoMode(object): + + def __init__(self, file, mode): + self.fileno = file.fileno() + self.mode = mode + + def __eq__(self, other): + return self.fileno == other.fileno() and self.mode == other.mode + + def __repr__(self): + return "FilenoMode({}, {!r})".format(self.fileno, self.mode) + + class TestFileTypeR(TempDirMixin, ParserTestCase): """Test the FileType option/argument type for reading files""" @@ -1459,7 +1472,8 @@ ('foo', NS(x=None, spam=RFile('foo'))), ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))), ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))), - ('-x - -', NS(x=sys.stdin, spam=sys.stdin)), + ('-x - -', NS(x=FilenoMode(sys.stdin, 'r'), + spam=FilenoMode(sys.stdin, 'r'))), ('readonly', NS(x=None, spam=RFile('readonly'))), ] @@ -1483,7 +1497,8 @@ ('foo', NS(x=None, spam=RFile('foo'))), ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))), ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))), - ('-x - -', NS(x=sys.stdin, spam=sys.stdin)), + ('-x - -', NS(x=FilenoMode(sys.stdin, 'rb'), + spam=FilenoMode(sys.stdin, 'rb'))), ] @@ -1522,7 +1537,8 @@ ('foo', NS(x=None, spam=WFile('foo'))), ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))), ('bar -x foo', NS(x=WFile('foo'), spam=WFile('bar'))), - ('-x - -', NS(x=sys.stdout, spam=sys.stdout)), + ('-x - -', NS(x=FilenoMode(sys.stdout, 'w'), + spam=FilenoMode(sys.stdout, 'w'))), ] @@ -1537,7 +1553,8 @@ ('foo', NS(x=None, spam=WFile('foo'))), ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))), ('bar -x foo', NS(x=WFile('foo'), spam=WFile('bar'))), - ('-x - -', NS(x=sys.stdout, spam=sys.stdout)), + ('-x - -', NS(x=FilenoMode(sys.stdout, 'wb'), + spam=FilenoMode(sys.stdout, 'wb'))), ]