New submission from Terry J. Reedy <tjre...@udel.edu>:

'python somefile.py' sets main.__file__ to 'somefile.py'. 'python' leaves 
__file__ unset.  If PYTHONSTARTUP is set to somefile.py, 'python' executes 
somefile.py in main with __file__ set to 'somefile.py', then unsets __file__ 
before the >>> prompt, as if somefile has not been executed.  Any explicit 
setting of __file__ in somefile is undone.

tem2.py:
print(__name__, __file__)
__file__ = 'abc.py'

> F:\dev\3x> set PYTHONSTARTUP=f:/python/a/tem2.py
> F:\dev\3x> python
...
__main__ f:/python/a/tem2.py
>>> __file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__file__' is not defined

With IDLE, when 'python -m idlelib.idle' is run with '-s' or '-r 
f:/python/a/tem2.py', NameError is raised for the print in tem2.py. This was 
reported this SO question.
https://stackoverflow.com/questions/49054093/cannot-use-file-when-opening-module-in-idle
 

In both cases, the file is run with execfile(filename).

    def execfile(self, filename, source=None):
        "Execute an existing file"
        if source is None:
            with tokenize.open(filename) as fp:
                source = fp.read()

My guess is that wrapping the source with f"__file__ = {filename}\n" and "del 
__file__\n" should work.

----------
assignee: terry.reedy
components: IDLE
messages: 313140
nosy: terry.reedy
priority: normal
severity: normal
stage: needs patch
status: open
title: IDLE: set and unset __file__ for startup files
type: behavior
versions: Python 3.6, Python 3.7, Python 3.8

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue32984>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to