[英]pip installed namespace turns into a builtin
我正在嘗試調試一個復雜的情況,其中一個*nspkg.pth
文件創建了一個內置軟件包,該軟件包在*nspkg.pth
了導入。
在這種情況下,我仍在使用Python2.7。
為了確保該軟件包是正確的,我從一個“幾乎為空”的軟件包開始(其內容如下所示),並且我有這種奇怪的行為:如果我使用python setup.py install
,則一切正常,如果我使用pip
名稱空間安裝似乎是內置的:
setup(
name='jmb.vega',
namespace_packages=['jmb'],
version="0.1",
description='Test package',
author='Alessandro Dentella',
packages=find_packages(exclude=['tests', 'tests.*']),
platforms='any',
zip_safe=False,
install_requires=[
'setuptools',
],
)
而在jmb中的初始化是:
sandro@bluff:/tmp/jmb.vega$ cat jmb/__init__.py
__import__('pkg_resources').declare_namespace(__name__)
配置有什么問題? 為什么pip使其成為內置包?
root@argo-stretch:/tmp/jmb.vega# python setup.py install
...
root@argo-stretch:/tmp/jmb.vega# python -c 'import jmb; print(jmb)'
<module 'jmb' from '/usr/local/lib/python2.7/dist-packages/jmb.vega-0.1-py2.7.egg/jmb/__init__.pyc'>
在這種情況下,不會創建文件“ jmb.vega-0.1-nspkg.pth”,並且將雞蛋添加到“ easy-install.pth”
使用pip進行安裝時
root@argo-stretch:/tmp/jmb.vega# pip install .
Processing /tmp/jmb.vega
Requirement already satisfied: setuptools in /usr/lib/python2.7/dist-packages (from jmb.vega==0.1)
Installing collected packages: jmb.vega
Running setup.py install for jmb.vega ... done
Successfully installed jmb.vega-0.1
文件'jmb.tools-0.7-py2.7-nspkg.pth'已創建,並且模塊似乎是內置的
root@argo-stretch:/tmp/jmb.vega# (cd ; python -c 'import jmb; print(jmb)')
<module 'jmb' (built-in)>
在實際情況下,這足以破壞對名稱空間“ jmb”的任何調用的導入系統。
測試包是
jmb.vega/
├── jmb
│ ├── __init__.py
│ └── vega
│ └── __init__.py
└── setup.py
sandro @ bluff:/tmp/jmb.vega$來自setuptools導入安裝程序find_packages的cat setup.py
它不是內置的。 您看到的是正常現象。 模塊類型的__repr__
只是認為沒有__file__
任何模塊對象都是內置的 ,在Python 2上:
filename = PyModule_GetFilename((PyObject *)m);
if (filename == NULL) {
PyErr_Clear();
return PyString_FromFormat("<module '%s' (built-in)>", name);
}
命名空間包沒有__file__
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.