导入Python命名空间包的本地测试版本

2024-05-29 00:17:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何导入一个Python 2.7版本的本地命名空间。在本例中,包Ska.engarchive是根目录下的命名空间包。(这个结构是由传统强加给我的)。在

{3}示例显示,即使在本地版本的cd3>安装后,也不会安装本地版本。在

Python 2.7.9 |Continuum Analytics, Inc.| (default, Apr 14 2015, 12:54:25)
... 
In [1]: import sys
In [2]: sys.path.insert(0, '.')
In [3]: import Ska.engarchive.fetch_eng as fetch
In [4]: fetch.__file__
Out[4]: '/proj/sot/ska/arch/x86_64-linux_CentOS-5/lib/python2.7/site-packages/Ska.engarchive-0.36.2-py2.7.egg/Ska/engarchive/fetch_eng.pyc'

我认为这个问题与python2中实现名称空间包的方式有关,不管怎样,名称空间路径总是位于列表的前面。但也许有一些解决办法?我花了一些时间研究site包文档,但也许我只是没有看到正确的东西。在

上面的示例使用Anaconda Python发行版。有趣的是,如果我使用ActiveState中的Python的一个非常旧的版本,那么这个示例将获得导入本地包的预期结果:

^{pr2}$

任何帮助都将不胜感激!在


Tags: inimport版本名称示例syssite空间
1条回答
网友
1楼 · 发布于 2024-05-29 00:17:42

我能够使用setuptools的namespace packages(但不是标准的pkgutil method)复制这种行为。Setuptools将导入已安装的包,而pkgutil将导入本地包。Setuptools似乎是从预期的(首先安装,然后本地安装)向后加载__path__。E、 g.,(参见底部示例了解nstest的定义)

>>> import nstest
>>> nstest.__path__
['/home/caleb/.local/lib/python2.7/site-packages/nstest.foo-0.0.0-py2.7.egg/nstest', 'nstest']

解决这个问题的方法是将__path__前面的本地包添加到最右边的命名空间包中。E、 g

^{pr2}$

既然您在问题中说Ska.engarchive是一个名称空间包,那么在您的解释器中,您需要执行以下操作:

>>> import Ska.engarchive
>>> Ska.engarchive.__path__.insert(0, 'Ska/engarchive')
>>> import Ska.engarchive.fetch_eng as fetch
>>> fetch.__file__
'Ska/engarchive/fetch_eng.pyc' # This should be outputted

使用setuptools的pkg_资源进行命名空间测试

目录结构:

nstest.foo/
├─ setup.py
└─ nstest/
   ├─ __init__.py
   └─ foo/
      └─ __init__.py

nstest.foo/设置.py

from setuptools import setup, find_packages
setup(name='nstest.foo', packages=find_packages())

nstest.foo/nstest/\u初始化__.py

__import__('pkg_resources').declare_namespace(__name__)

nstest.foo/nstest/foo//__.py

# empty

安装:

$ python2 setup.py build
$ python2 setup.py install  user

测试:

$ python2
>>> from nstest import foo
>>> foo.__file__
'/home/caleb/.local/lib/python2.7/site-packages/nstest.foo-0.0.0-py2.7.egg/nstest/foo/__init__.pyc'

相关问题 更多 >

    热门问题