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 2008年10月28日 17:19 by exarkun, last changed 2022年04月11日 14:56 by admin. This issue is now closed.
| Messages (12) | |||
|---|---|---|---|
| msg75292 - (view) | Author: Jean-Paul Calderone (exarkun) * (Python committer) | Date: 2008年10月28日 17:19 | |
It'd be better if it did. |
|||
| msg75295 - (view) | Author: Guilherme Polo (gpolo) * (Python committer) | Date: 2008年10月28日 17:27 | |
doesn't it ? it works here |
|||
| msg75296 - (view) | Author: Guilherme Polo (gpolo) * (Python committer) | Date: 2008年10月28日 17:43 | |
Well anyway, some sample code:
import zipfile
z = zipfile.ZipFile('aaa.zip', mode='w')
z.writestr('aa.py', 'def x(): print "hi there"\n\ndef y(): print "hi"')
z.close()
and then:
import sys
import inspect
sys.path.append('aaa.zip')
import aa
inspect.getsource(aa.x)
inspect.getsource(aa.y)
Doesn't that work for you ?
|
|||
| msg75298 - (view) | Author: Jean-Paul Calderone (exarkun) * (Python committer) | Date: 2008年10月28日 17:51 | |
It seems to depend on working directory: exarkun@charm:/tmp$ python Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.append('/home/exarkun/foobar.zip') >>> import foobar, inspect >>> inspect.getsource(foobar.foo) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.5/inspect.py", line 629, in getsource lines, lnum = getsourcelines(object) File "/usr/lib/python2.5/inspect.py", line 618, in getsourcelines lines, lnum = findsource(object) File "/usr/lib/python2.5/inspect.py", line 468, in findsource raise IOError('could not get source code') IOError: could not get source code >>> versus: exarkun@charm:~$ python Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.append('/home/exarkun/foobar.zip') >>> import foobar, inspect >>> inspect.getsource(foobar.foo) 'def foo():\n pass\n' >>> |
|||
| msg75301 - (view) | Author: Alexander Belopolsky (belopolsky) * (Python committer) | Date: 2008年10月28日 18:51 | |
This must be very similar to #4197 and #4201 that I reported a few days ago. I'll see if a similar patch would work in this case. |
|||
| msg75302 - (view) | Author: Alexander Belopolsky (belopolsky) * (Python committer) | Date: 2008年10月28日 19:24 | |
Hmm, apparently inspect was made to work with zipped modules back in r45248 . I cannot reproduce the problem either. Jean-Paul, can you attach your foobar.zip? What else do you have in your /tmp directory? |
|||
| msg75303 - (view) | Author: Martin v. Löwis (loewis) * (Python committer) | Date: 2008年10月28日 21:48 | |
In any case, it's clearly not a candidate for 2.5.3, due to the lack of a clear problem description, and a working patch. That essentially means that associating the version 2.5 is also fairly pointless, but I'll leave that in, anyway. |
|||
| msg75306 - (view) | Author: Jean-Paul Calderone (exarkun) * (Python committer) | Date: 2008年10月28日 21:59 | |
Here is a transcript for a complete, self-contained, minimal reproduction: exarkun@charm:~$ cd /tmp exarkun@charm:/tmp$ mkdir zipimportbugexample exarkun@charm:/tmp$ cd zipimportbugexample/ exarkun@charm:/tmp/zipimportbugexample$ mkdir foobar exarkun@charm:/tmp/zipimportbugexample$ echo "def foo(): pass" > foobar/__init__.py exarkun@charm:/tmp/zipimportbugexample$ zip foobar.zip foobar adding: foobar/ (stored 0%) exarkun@charm:/tmp/zipimportbugexample$ zip foobar.zip foobar/__init__.py adding: foobar/__init__.py (stored 0%) exarkun@charm:/tmp/zipimportbugexample$ rm -r foobar exarkun@charm:/tmp/zipimportbugexample$ mkdir workingdirectory exarkun@charm:/tmp/zipimportbugexample$ cd workingdirectory/ exarkun@charm:/tmp/zipimportbugexample/workingdirectory$ python Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.append('/tmp/zipimportbugexample/foobar.zip') >>> import foobar, inspect >>> inspect.getsource(foobar.foo) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.5/inspect.py", line 629, in getsource lines, lnum = getsourcelines(object) File "/usr/lib/python2.5/inspect.py", line 618, in getsourcelines lines, lnum = findsource(object) File "/usr/lib/python2.5/inspect.py", line 468, in findsource raise IOError('could not get source code') IOError: could not get source code >>> |
|||
| msg75308 - (view) | Author: Alexander Belopolsky (belopolsky) * (Python committer) | Date: 2008年10月28日 22:46 | |
Thanks, Jean-Paul, I can now reproduce your problem and I think I found the culprit. I believe the file name check in linecache.updatecache is unnecessary and is responsible for this problem. With the following patch: --- Lib/linecache.py (revision 67040) +++ Lib/linecache.py (working copy) @@ -88,7 +88,7 @@ get_source = getattr(loader, 'get_source', None) if name and get_source: - if basename.startswith(name.split('.')[-1]+'.'): +# if basename.startswith(name.split('.')[-1]+'.'): try: data = get_source(name) except (ImportError, IOError): and Jean-Paul's foobar: $ PYTHONPATH=/tmp/foobar.zip ./python.exe -c "import inspect,foobar; print inspect.getsource(foobar)" def foo(): pass Martin, is there a chance for this issue and #4197, #4201 to make it to 2.5.3? If so, I'll prepare a combined patch with tests for your consideration shortly. |
|||
| msg77772 - (view) | Author: Alyssa Coghlan (ncoghlan) * (Python committer) | Date: 2008年12月14日 01:31 | |
After looking into this, I think Alexander is correct. There is no standard mapping between __file__ and __name__ and linecache is mistaken in assuming such a mapping exists for all importers (and is the same as the standard filesystem to name mapping to boot). In this particular case, it was the differences between the way the two relate for a package vs a normal module that was confusing linecache, but for more exotic cases the filesystem based rules that linecache was attempting to enforce may be completely irrelevant. |
|||
| msg77788 - (view) | Author: Alyssa Coghlan (ncoghlan) * (Python committer) | Date: 2008年12月14日 10:59 | |
Fixed for 2.7 in r67750. Will be ported to 2.6, 3.0 and 3.1. |
|||
| msg77795 - (view) | Author: Alyssa Coghlan (ncoghlan) * (Python committer) | Date: 2008年12月14日 12:12 | |
Final revisions for fix: 2.7 = r67751 (there was a new test file missing from the initial checkin) 2.6 = r67752 3.1 = r67753 3.0 = r67754 |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:56:40 | admin | set | github: 48473 |
| 2008年12月14日 12:12:41 | ncoghlan | set | status: open -> closed resolution: fixed messages: + msg77795 |
| 2008年12月14日 10:59:13 | ncoghlan | set | messages: + msg77788 |
| 2008年12月14日 01:31:52 | ncoghlan | set | messages: + msg77772 |
| 2008年12月03日 20:29:22 | ncoghlan | set | assignee: ncoghlan nosy: + ncoghlan |
| 2008年10月28日 22:46:59 | belopolsky | set | messages: + msg75308 |
| 2008年10月28日 21:59:39 | exarkun | set | messages: + msg75306 |
| 2008年10月28日 21:48:40 | loewis | set | nosy:
+ loewis messages: + msg75303 versions: - Python 2.5.3 |
| 2008年10月28日 19:24:13 | belopolsky | set | messages: + msg75302 |
| 2008年10月28日 18:51:49 | belopolsky | set | nosy:
+ belopolsky messages: + msg75301 |
| 2008年10月28日 17:51:24 | exarkun | set | messages: + msg75298 |
| 2008年10月28日 17:43:54 | gpolo | set | messages: + msg75296 |
| 2008年10月28日 17:27:30 | gpolo | set | nosy:
+ gpolo messages: + msg75295 |
| 2008年10月28日 17:19:45 | exarkun | create | |