Run Windows commands from Python console
Terry Reedy
tjreedy at udel.edu
Sun Sep 3 17:09:28 EDT 2017
On 9/3/2017 11:17 AM, eryk sun wrote:
> On Sun, Sep 3, 2017 at 7:56 AM, <g.morkvenas at gmail.com> wrote:
>> What means line below:
>>
>> File "<stdin>", line 1
>>
>> I don't have any <stdin> file.
>
> Indeed, on Windows you cannot create a file named "<stdin>". Python
> uses this fake name for the code object it compiles when reading from
> stdin (i.e. the file stream opened for console input).
>
> It's not exactly smart about this, either, since whenever an exception
> is raised in the REPL it will try to open this fake file multiple
> times, including trying every entry in sys.path. For example, in a
> typical Python 3.6 all-users installation, it will try opening the
> following file paths:
>
> <stdin>
> <stdin>
> C:\Program Files\Python36\python36.zip\<stdin>
> C:\Program Files\Python36\python36.zip\<stdin>
> C:\Program Files\Python36\DLLs\<stdin>
> C:\Program Files\Python36\lib\<stdin>
> C:\Program Files\Python36\<stdin>
> C:\Program Files\Python36\lib\site-packages\<stdin>
> ...
>
> Of course, all of these attempts to open "<stdin>" necessarily fail on
> Windows.
The result, after doing all the above, is tracebacks like
>>> def f():
... return 1/0
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
ZeroDivisionError: division by zero
with source lines missing. Note that 'line 1' is misleading as the
'f()' call is on line 4. It is the first line of the 2nd statement.
In IDLE, trackbacks *do* include source lines.
>>> def f():
return 1/0
>>> f()
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
f()
File "<pyshell#1>", line 2, in f
return 1/0
ZeroDivisionError: division by zero
Each statement is numbered, and treated as a file, so that line
numbering starts at 1 for each statement.
The secret to doing this is that traceback printing looks in
linecache.cache *before* trying to open a file, as described above.
When the file is read, it is added to the cache. IDLE stuffs the lines
for each statement into the cache and replaces linecache.checkcache with
a wrapper that prevents them from being deleted.
> On Unix, however, this can actually succeed, which is kind of
> funny:
>
> >>> open('<stdin>', 'w').write('What the !@#$%^&*?')
> 18
>
> >>> dit
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> What the !@#$%^&*?
> NameError: name 'dit' is not defined
Won't happen with <pyshell#N>
--
Terry Jan Reedy
More information about the Python-list
mailing list