找出试图在一个模块python中使用导入的模块名称

时间:2014-02-04 05:37:01

标签: python python-3.x

我试图弄清楚是否有办法检测试图从模块导入东西的模块的名称,例如我有一个名为“all_modules”的模块,其中我存储了我需要的所有导入整个文件夹,并认为它更容易导入teh文件然后多个相同的导入跨我的所有文件,但通过这样做,我注意到它一旦遇到导入自己就停止尝试导入模块。例如,这就是我这样做的一般想法:

   #all_modules.py
   import sys, os, time, threading, re, random, urllib.request, urllib.parse
   import a, b, c, d # fake modules but general idea is here
   # any modules you would need throughout the folder really this is just a small example

   #a.py 
   from all_modules import * 
   print(sys.version_info) # works fine but lets do the last module

   #c.py
   from all_modules import *
   and_one_more.someFunction("Hello, World!") # it didn't import it because it stopped when it tried to import itself

所以我的想法是找出试图访问导入然后执行此操作的文件的名称

  #all_modules.py - Example two
  module_list = ["sys", "os", "time", "threading", "re", "random", "urllib", "urllib.request", "urllib.parse", "a", "b", "c"]
  for module in module_list:
      if file_name == module: continue # this is what I do not know how to do and not sure if it is even possible, but it's the only solution I have to be able to try to do what I am doing 

      globals()[module] = __import__(module)

我想知道是否有一些工作可以阻止这个,或者我是否必须导入我在整个文件中使用的所有模块?目前我得到另一个模块没有导入的错误,因为它没有导入其余的模块,所以我想知道我想做什么是可能的或者修复问题的东西会很棒,或者我是否必须在整个文件中单独导入模块?

2 个答案:

答案 0 :(得分:1)

如何使用load_module模块中的imp方法:

#!/usr/bin/python

import imp
import sys

def __import__(name, globals=None, locals=None, fromlist=None):

    try:
        return sys.modules[name]
    except KeyError:
        pass

    fp, pathname, description = imp.find_module(name)
    try:
        return imp.load_module(name, fp, pathname, description)
    finally:
        if fp:
            fp.close()

module_list = ["sys", "os",
               "time", "threading",
               "re",
               "urllib" ]

for module in module_list:
    module = __import__(module)
    print module

输出:

 <module 'sys' (built-in)>
 <module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
 <module 'time' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/time.so'>
 <module 'threading' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.pyc'>
 <module 're' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.pyc'>
 <module 'urllib' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.pyc'>

答案 1 :(得分:0)

您面临的问题是经典的周期性进口问题。在python中,解决它的最简单方法是简单地不做你正在做的事情,如果你绝对有两个相互依赖的模块,你可以简单地将模块作为命名空间导入而不是在其中定义的所有内容(即。import x vs from x import *)。

一般来说,* python中的*导入是不受欢迎的,因为对于其他人来说,读取你的代码并不明确。它基本上打败了命名空间的目的。

你应该真正阅读PEP8。如果您打算将代码发布到世界上,那么您应该尝试遵循这种风格指南。