免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4126 | 回复: 11
打印 上一主题 下一主题

求助:获取已经导入的包或文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-17 14:28 |只看该作者 |倒序浏览
Python 有木有类似php的 get_included_files 返回一个数组 把已经导入的包列出来

谢谢

论坛徽章:
0
2 [报告]
发表于 2012-08-17 14:34 |只看该作者
回复 1# pxllong


    用dir()函数就可以。

论坛徽章:
0
3 [报告]
发表于 2012-08-19 17:00 |只看该作者
大家什么看法?我先支持

论坛徽章:
0
4 [报告]
发表于 2012-08-19 20:40 |只看该作者
回复 2# Hadron74
dir()可以吗?

print [k for k,v in globals().items() if type(v) is type(__builtins__)]

   

论坛徽章:
0
5 [报告]
发表于 2012-08-19 22:14 |只看该作者
本帖最后由 Hadron74 于 2012-08-19 22:15 编辑

回复 4# 106033177


同意你的说法,dir()给的只是当前的locals()的keys()。
不能完全反应楼主的意思。误导了,抱歉!

但是你的代码也不对,对于在函数内定义的包,不能用globals()代表,加入locals()也不对:如以下代码
  1. >>> def b():
  2. ...     import sys
  3. ...     def c():
  4. ...             import math
  5. ...             d=[k for k,v in globals().items()+locals().items() if type(v) is type(__builtins__)]
  6. ...             print d
  7. ...     c()
  8. ...
  9. >>> b()
  10. ['__builtins__', 'math']
复制代码
输出中缺少了sys,它即不在globals中,也不在locals中,但也是导入的包,这种情况怎么办呢?


请教有没有解决方案呢?

论坛徽章:
0
6 [报告]
发表于 2012-08-19 23:25 |只看该作者
回复 4# 106033177


用globals()之类的问题,还有一个问题。
是如果用户用
from os import *
那么os就显示不出来了?

这怎么办呢?
   

论坛徽章:
0
7 [报告]
发表于 2012-08-20 08:25 |只看该作者
本帖最后由 106033177 于 2012-08-20 08:31 编辑

回复 5# Hadron74
关于第一个问题建议去看一下作用域的问题, 在函数内导入的模块只在函数定义命名空间内有效,尤其是对于你举的例子 math 只在函数c定义的空间有效,对于函数b它是不存在的。关于第二个问题from os  import  * 是将os模块内的命名导入到当前模块命名空间,但是os本身在当前模块的符号表中并不存在。如果非要把这两种情况也算上的话,可以这样:
  1. import sys
  2. from json import dump
  3. def f():
  4.     import os
  5. f()
  6. print sys.modules.keys()

复制代码

论坛徽章:
0
8 [报告]
发表于 2012-08-20 08:47 |只看该作者
回复 7# 106033177

关于第一个问题,你可能没看清楚。在例子中时sys没有了,这个包在函数c中是可以调用的。

你对第二个问题的解答,我试了一下,是不是结果太多了,不知我们想要的结果:

>>> print sys.modules.keys()
['json.decoder', 'copy_reg', 'sre_compile', '_sre', 'encodings', 'site', '__buil
tin__', '__main__', 'encodings.encodings', 'json.math', 'json.sre_constants', 'j
son.sre_compile', 'abc', 'posixpath', 'errno', '_json', 'encodings.codecs', 'sre
_constants', 're', 'json', '_abcoll', 'types', '_codecs', '_warnings', 'math', '
json._json', 'genericpath', 'stat', 'zipimport', 'encodings.__builtin__', 'warni
ngs', 'UserDict', 'json.json', 'encodings.utf_8', 'json.sys', 'sys', 'json.scann
er', 'codecs', 'json.encoder', 'readline', 'os.path', 'json.re', 'signal', 'line
cache', 'json.sre_parse', 'posix', 'encodings.aliases', 'exceptions', 'sre_parse
', 'os']

   

论坛徽章:
0
9 [报告]
发表于 2012-08-20 09:13 |只看该作者
回复 8# Hadron74
sys在函数c中当然是可以引用,因为sys在函数b定义命名空间有效,但是离开函数b命名空间sys都是无效的,关于这一点还是建议研究一下关于作用域的资料。



   

论坛徽章:
0
10 [报告]
发表于 2012-08-20 09:30 |只看该作者
回复 8# Hadron74
Hadron74 发表于 2012-08-20 08:47
你对第二个问题的解答,我试了一下,是不是结果太多了,不知我们想要的结果 ...

关于第二个问题就再说一句吧,from os import *    导入的是os模块里的所有命名,但是os本身在当前命名空间中是不存在的。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP