This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2010年04月24日 01:18 by dangyogi, last changed 2022年04月11日 14:57 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| idle.patch | dangyogi, 2010年04月24日 01:18 | Patch file for idlelib/ScriptBinding.py in Python 2.6.5 | ||
| Messages (8) | |||
|---|---|---|---|
| msg104066 - (view) | Author: Bruce Frederiksen (dangyogi) | Date: 2010年04月24日 01:18 | |
The python CLI always sets the __file__ variable, whether run as: $ python foobar.py or $ python -m foobar or $ python >>> import foobar # __file__ set in foobar module The idle program sets the __file__ variable properly when you do the import from the idle shell, but __file__ is not set with the "Run Module" (F5) command from the editor. I've included a patch file to set __file__, but it doesn't del it after the module has run. But maybe this is OK, because the os.chdir is not undone either??? |
|||
| msg107551 - (view) | Author: Tal Einat (taleinat) * (Python committer) | Date: 2010年06月11日 15:11 | |
I believe IDLE runs modules via execfile(), so I would expect the behavior to be similar, and execfile() does not set __file__. Doing "Run Module" is also IMO equivalent to doing execfile(), so this behavior retains consistency. However, I would expect __file__ to be set when running IDLE -r <script>, but I get "name '__file__' is not defined" (with Python 2.6.2). This is inconsistent and should be fixed. |
|||
| msg107580 - (view) | Author: Bruce Frederiksen (dangyogi) | Date: 2010年06月11日 20:21 | |
No, IDLE compiles the module (with the 'compile' built-in using the 'exec' option) and then does an 'exec' on the code (in PyShell.py). It has several lines of code that it runs before this exec to prepare the environment that the code is run in. It appears to be an oversight that the __file__ variable is not being set as a part of this preparation code to match the behavior of the python CLI. The patch that I included only changes one line of this preparation code to also set the __file__ variable and that fixes the problem. If you examine the IDLE code in the immediate vicinity of my patch you will see this. I have several use cases where I'm relying on the __file__ variable in my module so that it can find other non .py files that it needs in the same directory that it's in. This works under all combinations of uses from the CLI, but fails in IDLE using Run Module. The language reference manual<http://docs.python.org/reference/datamodel.html?highlight=__file__>states under "Module": Predefined (writable) attributes: __name__ is the module’s name; __doc__ is > the module’s documentation string, or None if unavailable; __file__ is the > pathname of the file from which the module was loaded, if it was loaded from > a file. The __file__ attribute is not present for C modules that are > statically linked into the interpreter; for extension modules loaded > dynamically from a shared library, it is the pathname of the shared library > file. > The python CLI honors this definition in all cases, but IDLE/Run Module does not. On Fri, Jun 11, 2010 at 11:11 AM, Tal Einat <report@bugs.python.org> wrote: > > Tal Einat <taleinat@users.sourceforge.net> added the comment: > > I believe IDLE runs modules via execfile(), so I would expect the behavior > to be similar, and execfile() does not set __file__. Doing "Run Module" is > also IMO equivalent to doing execfile(), so this behavior retains > consistency. > > However, I would expect __file__ to be set when running IDLE -r <script>, > but I get "name '__file__' is not defined" (with Python 2.6.2). This is > inconsistent and should be fixed. > > ---------- > nosy: +taleinat > > _______________________________________ > Python tracker <report@bugs.python.org> > <http://bugs.python.org/issue8515> > _______________________________________ > |
|||
| msg107593 - (view) | Author: Tal Einat (taleinat) * (Python committer) | Date: 2010年06月11日 22:03 | |
Why doesn't execfile() set __file__? I would be surprised if this is due to an oversight by the Python devs. In both execfile and IDLE's "Run Module" I can't think of a reason not to set __file__, but perhaps this was intentional? Googling a bit hasn't brought up much. I am currently of the opinion that both IDLE and execfile() should set __file__ (with execfile() perhaps requiring more thinking about edge-cases, since it can be passes locals and globals dictionaries). |
|||
| msg149065 - (view) | Author: Roger Serwy (roger.serwy) * (Python committer) | Date: 2011年12月09日 00:50 | |
I've encountered this bug several times myself. I applied this patch and it corrects the issue. |
|||
| msg157609 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2012年04月05日 18:55 | |
New changeset 2c276d0553ff by Andrew Svetlov in branch 'default': Issue #8515: Set __file__ when run file in IDLE. http://hg.python.org/cpython/rev/2c276d0553ff |
|||
| msg157610 - (view) | Author: Andrew Svetlov (asvetlov) * (Python committer) | Date: 2012年04月05日 19:00 | |
Thanks to all. Bruce Frederiksen, you are mentioned in Misc/ACK Tal Einat, if you want to make a patch which will use `execfile` instead of current approach — you are welcome. Please file new issue. |
|||
| msg192090 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2013年06月30日 23:08 | |
New changeset a958b7f16a7d by Terry Jan Reedy in branch '2.7': Issue #8515: Set __file__ when run file in IDLE. Backport 2c276d0553ff by http://hg.python.org/cpython/rev/a958b7f16a7d |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:57:00 | admin | set | github: 52761 |
| 2013年06月30日 23:09:39 | terry.reedy | link | issue18288 dependencies |
| 2013年06月30日 23:08:17 | python-dev | set | messages: + msg192090 |
| 2012年04月05日 19:00:41 | asvetlov | set | status: open -> closed versions: - Python 2.7, Python 3.2 messages: + msg157610 assignee: asvetlov resolution: fixed stage: resolved |
| 2012年04月05日 18:55:20 | python-dev | set | nosy:
+ python-dev messages: + msg157609 |
| 2012年03月31日 14:35:03 | asvetlov | set | nosy:
+ asvetlov |
| 2011年12月09日 00:50:07 | roger.serwy | set | nosy:
+ roger.serwy messages: + msg149065 versions: + Python 2.7, Python 3.2, Python 3.3, - Python 2.6 |
| 2010年06月11日 22:03:51 | taleinat | set | messages: + msg107593 |
| 2010年06月11日 21:07:52 | eric.araujo | set | files: - unnamed |
| 2010年06月11日 20:21:53 | dangyogi | set | files:
+ unnamed messages: + msg107580 |
| 2010年06月11日 15:11:27 | taleinat | set | nosy:
+ taleinat messages: + msg107551 |
| 2010年04月24日 01:18:09 | dangyogi | create | |