Python导入名称冲突

标签 python python-import name-clash

<分区>

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

import test.script

和图书馆作为:

import library

只要我不需要任何名称与我的任何脚本相对应的库,它就可以工作。当它发生时,将加载脚本,而不是库。有没有办法强制本地导入在我使用文件时使用完整路径?还是有另一种方法可以在不重命名脚本的情况下防止名称冲突?

最佳答案

当您将“脚本”命名为与依赖项同名时,您已经拦截了对该名称的查找。

您可以修改您的 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 中的查找顺序。

不会命名任何与依赖项同名的脚本,唯一的异常(exception)是我打算用语义上相同的东西截取名称。

Namespaces are one honking great idea -- let's do more of those!

您需要自己的命名空间。创建一个目录,例如 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)]'

关于Python导入名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50910341/

相关文章:

Python导入依赖

python - Python 中导入模块和从模块导入之间存在差异的问题

Java 名称冲突错误,尽管方法签名不同

c++ - 类名和枚举值之间的冲突 : resolvable without namespaces?

python - 如何使用getattr调用字符串作为属性?

python - Python 中的 SICP "streams as signals"

python - 如何使用 Pandas/Python 查询 HDF 存储

python - 使用 Python 发现 Web 服务

python - 在没有路径黑客的情况下构建 python 项目

c++ - 名称与类方法冲突