Python导入名称冲突

时间:2018-06-18 13:12:09

标签: python python-import name-clash

当我有一个包test时,我习惯从中导入另一个文件script

import test.script

和图书馆:

import library

只要我不需要任何名称与我的任何脚本对应的库,这就可以工作。当它发生时,加载脚本而不是库。有没有办法强制本地导入使用完整路径来文件,因为我正在使用它?或者是否有其他方法可以防止名称冲突,而无需重命名脚本?

1 个答案:

答案 0 :(得分:1)

当您命名与依赖项同名的“脚本”时,您已截获该名称的查找。

您可以修改您的PYTHONPATH即sys.path,将您的依赖项放在“脚本”前面,但之后您已截获脚本 - 这似乎是一个非常糟糕的主意。

>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)
['',                               # Current Working Directory
 '~\\Anaconda3\\python36.zip',
 '~\\Anaconda3\\DLLs',
 '~\\Anaconda3\\lib',
 '~\\Anaconda3',
 '~\\Anaconda3\\lib\\site-packages',
 '~\\Anaconda3\\lib\\site-packages\\Sphinx-1.5.6-py3.6.egg',
 '~\\Anaconda3\\lib\\site-packages\\win32',
 '~\\Anaconda3\\lib\\site-packages\\win32\\lib',
 '~\\Anaconda3\\lib\\site-packages\\Pythonwin',
 '~\\Anaconda3\\lib\\site-packages\\setuptools-27.2.0-py3.6.egg']

请勿修改sys.path

中的查找顺序

命名任何与依赖项同名的脚本,唯一的例外是我打算用语义上相同的东西拦截名称。

  

命名空间是一个很好的主意 - 让我们做更多的事情!

您需要自己的命名空间。创建一个目录,例如a_namespace,将脚本放在该目录中,并从父目录开始工作。例如:

>>> from pathlib import Path
>>> Path('a_namespace').mkdir()
>>> (Path('a_namespace') / 'sys.py').write_text('print("importing my sys")')
25
>>> import a_namespace.sys
importing my sys

你仍然可以找到你的依赖项:

>>> import sys
>>> sys.version
'3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)]'