如何解决Python中的模块名冲突?
我有一个名为websocket的模块。对于这个模块,我需要一些测试,对于这些测试,我安装相应的模块。问题是安装的模块与我自己的模块的名称完全相同 项目结构:如何解决Python中的模块名冲突?,python,name-collision,Python,Name Collision,我有一个名为websocket的模块。对于这个模块,我需要一些测试,对于这些测试,我安装相应的模块。问题是安装的模块与我自己的模块的名称完全相同 项目结构: websocket-server | |---- websocket.py | '---- tests | '---- test.py from websocket import WebSocketsServer # my
websocket-server
|
|---- websocket.py
|
'---- tests
|
'---- test.py
from websocket import WebSocketsServer # my module
from websocket import create_connection # installed module
测试.py:
websocket-server
|
|---- websocket.py
|
'---- tests
|
'---- test.py
from websocket import WebSocketsServer # my module
from websocket import create_connection # installed module
有没有办法解决这个问题:
- 无需重命名我的模块(
)websocket.py
- 而不会用丑陋的
\uuuuu init\uuuuu()污染我的项目
- 需要同时在Python3和Python2上工作
from mywebsocket.websocket import WebSocketsServer # my module
from websocket import create_connection # installed module
请参见有一个imp模块,尽管它在Python3.4中即将被弃用。它允许您动态导入模块
my_websource = imp.load_source('my_websource', <path to your module.py>')
my_websource=imp.load_source('my_websource','))
我终于如愿以偿地解决了这个问题。这个解决方案很粗糙,但并不重要,因为它只针对一种特定类型的测试
import websocket as wsclient # importing the installed module
del sys.modules["websocket"]
sys.path.insert(0, '../..')
import websocket # importing my own module
因此,我现在可以将自己的模块称为
websocket
,将安装的模块称为wsclient
您可以选择不同的大写形式,如websocket,因为Python解析区分大小写。我已经解决了一个类似的问题,它只适用于UNIX/Linux
在根文件夹中,创建一个指向自身的软链接:
> ln -s . myroot
然后只需使用简单前缀导入所需内容:
import myroot.websocket
可能是唯一正确的答案,不包括黑客。如果你有测试,你应该有一个包。@goncalopp最终的“产品”是一个简单的文件。只为一个文件制作一个包感觉太多了。这里还有一个Python 3.3+解决方案:为什么要将模块重命名?这正是解决办法。@kindall,因为我不想要其他名字。对我来说,“websocket”是我的单文件模块的完美名称。