例如,我想为另一个项目制作一个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
有什么建议吗?
答案 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
。