Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python导入名称冲突_Python_Python Import_Name Clash - Fatal编程技术网

Python导入名称冲突

Python导入名称冲突,python,python-import,name-clash,Python,Python Import,Name Clash,当我有一个包test时,我习惯于从中导入另一个文件script,如下所示: import test.script 以及图书馆: import library 只要我不需要任何名称与我的任何脚本对应的库,这就可以工作。发生这种情况时,将加载脚本,而不是库。有没有办法强制本地导入使用文件的完整路径?或者是否有其他方法可以防止名称冲突,而不重命名脚本?当您使用与依赖项相同的名称命名“脚本”时,您已拦截该名称的查找 您可以修改PYTHONPATH,即sys.path,将依赖项放在“脚本”前面,但随后

当我有一个包
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']
不要修改系统路径中的查找顺序

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

名称空间是一个非常好的主意——让我们做更多的工作吧

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

因此,基本上,我必须将任何可能导致子包名称冲突的内容放入其中?@Fido由于您可能不知道所有依赖项,因此我强烈建议将“脚本”放入包中。我熟悉的大型开发项目就是这样做的。您不必这样做,但我能想到的唯一例外是坚持单个文件的项目(例如,瓶子)。创建的文件越多,发生名称冲突的可能性就越大。至少使用名称空间包。这似乎是一个最佳实践,而且我还没有见过任何不这样做的大规模开发。