如何防止Python模块导入自身?

时间:2009-12-04 16:54:38

标签: python import module

例如,我想为另一个项目制作一个sql炼金术插件。我想将该模块命名为sqlalchemy.py。这样做的问题是它阻止我导入sqlalchemy

#sqlalchemy.py
import sqlalchemy 

这将使模块自行导入。我试过这个,但它似乎不起作用:

import sys
#Remove the current directory from the front of sys.path
if not sys.path[0]:
    sys.path.pop(0)
import sqlalchemy

有什么建议吗?

3 个答案:

答案 0 :(得分:12)

编辑:由于OP现在已经提到该问题是相对导入优先于绝对的问题,因此OP特定问题的最简单解决方案是在模块的开头添加{{ 1}}改变了“偏好”/排序。

以下仍然适用于两个冲突绝对导入的棘手问题(这似乎不是OP当前面临的......):

导入名为from __future__ import absolute_import的模块后,该模块记录在x中 - 正在进行的更改sys.path将不会更改sys.modules。您还需要直接更改sys.modules。

例如,考虑:

sys.modules['x']

(再次运行会使用并显示.pyc文件,而不是.py文件。)

这不是最干净的方法,当然这种方式原来的foo模块不可避免地无法从外部访问(因为它的sys.modules条目已经被取代),但是你可以根据需要玩更脆弱的技巧(在删除之前隐藏$ cat a/foo.py print __file__; import sys; sys.path.insert(0, "b"); del sys.modules["foo"]; import foo $ cat b/foo.py print __file__ $ python2.5 -c'import sys; sys.path.insert(0, "a"); import foo' a/foo.py b/foo.py ,导入其他foo后将该模块放在其他位置并恢复原始sys.modules["foo"] - 等等),具体取决于您的确切需要。 (当然,首先避免名称冲突几乎总是比以这种方式围绕它们跳华尔更简单; - )。

答案 1 :(得分:2)

不要将它命名为sqlalchemy.py?

严重。我认为这是绝对进口应该解决的问题。在python 2.5中它不应该发生,但我可能是错的

答案 2 :(得分:2)

您可能会因交互式解释器中运行代码与文件之间的差异而受到灼伤。删除sys.path[0]为空的测试(当从文件运行时,它不是),导入现在应该可以正常工作。

$ more sqlalchemy.py
import sys
print sys.path[0]
sys.path.pop(0)
import sqlalchemy
print sqlalchemy.__file__
$ python sqlalchemy.py 
/Users/nad
/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/sqlalchemy/__init__.pyc
$ python
Python 2.6.4 (r264:75706, Oct 28 2009, 20:34:51) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys; print repr(sys.path[0])
''

编辑:如果您的主要模块是sqlalchemy.py,则以上情况适用。如果您的模块是由另一个模块导入的,那么您还必须像Alex解释的那样更改sys.modules