imp.load_source是另一个文件而不是.py,但该目录中也存在.py

时间:2015-03-16 14:50:32

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

我有这个设置:

档案: a.ext1 a.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工作吗?

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

1 个答案:

答案 0 :(得分:0)

Dunno关于创造空模块和追加路径的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']