【问题标题】:imp.load_source another file than .py , but a .py also exist in that directoryimp.load_source 不是 .py 的另一个文件,但该目录中也存在一个 .py
【发布时间】:2015-05-18 17:52:41
【问题描述】:

我有这个设置:

文件: a.ext1 一个.py

a.ext1 出于某种原因加载 a.py,但作为引擎我需要加载文件 a.ext1。

我可以让它在 py3 中正常工作,但我不能让它在 py2 中正常工作。

这是我的python2尝试:**这是主要流程,当然还有更多的代码。

file = os.path.abspath(os.path.expanduser('a.ext1')
directory = os.path.dirname(file)
sys.path.append(directory)
fullname = 'my.name.space.a'
sys.modules['my.name.space'] = imp.new_module('my.name.space')
x = imp.load_source(fullname,file)

现在,如果我这样做了; x,它会告诉我:

module 'my.name.space' from '<path>/a.ext1'

但是如果我执行 dir(x) ,它会给我来自 a.py 的东西。我希望它给我来自 a.ext1 文件的东西。

我怎样才能让它在 py2 上工作?

这是它在 py3 上的工作原理:

file = os.path.abspath(os.path.expanduser('a.ext1'))
directory = os.path.dirname(file)
sys.path.append(directory)
fullname = 'my.name.space.a'
loader = importlib.machinery.SourceFileLoader(fullname = fullname, 
                                              path = file)
x = loader.load_module()

现在 x 正是我想要的,a.ext1 文件,而不是 .py

知道我怎样才能让它为 py2 工作吗?

(顺便说一句,我已经阅读了关于堆栈溢出的所有关于这个主题的内容,但从来没有一个 .py 也存在过)

【问题讨论】:

    标签: python python-2.7 python-3.x python-import


    【解决方案1】:

    不知道关于创建空模块和附加路径的mumbo jumbo,但在2.7上对我来说同样适用。一个简单的独立示例绝对不应该有问题。

    我会说你的a.py 也被加载到my.name.space.a 中,在程序的其他地方,在这种情况下,它的内容与你在相同模块名称下加载的任何其他内容冲突。一次只能有一个给定名称的全局模块实例,例如:

    a.py:

    py_stuff = 1
    

    a.ext1

    ext1_stuff = 1
    

    test-ok.py:

    import imp
    
    x = imp.load_source('a', 'a.ext1')
    
    print(x) # <module 'a' from 'a.ext1'>
    print(dir(x)) # ['__builtins__', ..., 'ext1_stuff']
    

    test-not-ok.py:

    import imp
    
    import a
    
    x = imp.load_source('a', 'a.ext1')
    
    print(x) # <module 'a' from 'a.ext1'>
    print(dir(x)) # ['__builtins__', ..., 'ext1_stuff', 'py_stuff']
    

    【讨论】:

      猜你喜欢
      • 2016-12-21
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      相关资源
      最近更新 更多