python - Python 导入名称冲突
问题描述
当我有一个包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
.
我不会用与依赖项相同的名称命名任何脚本,唯一的例外是我打算用语义上相同的东西截取名称。
命名空间是一个很棒的想法——让我们做更多的事情!
您需要自己的命名空间。例如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)]'
推荐阅读
- google-cloud-platform - 如何在谷歌云函数中以 json payload 形式获取 http 请求
- powershell - Nuget restore 命令行响应 Package is not found on source - Artifactory 云服务器
- c# - 返回结果和任务的异步方法
- reactjs - 使用打字稿将 React Native 中的 UseState 传递给输入框组件并在 onChange 上更新它
- android - 错误:无法将参数类型“字符串”分配给参数类型“Uri”。- 'Uri' 来自 'dart:core'
- python - 即使安装了模块,导入似乎也不起作用 python 并返回“ModuleNotFoundError”
- python - 如何知道一个值是否在python中的相同时间范围内
- kubernetes - 尝试在 VM 上运行的 Kubernetes 集群上运行 Prometheus 时出错
- c++ - 当我尝试实现计数排序时出现此错误“问题导致程序停止正常工作 Windows
- python - 具有不同 y 轴的同一可视化中的 2 个线图