导入 Python 命名空间包的本地测试版本
Import local testing version of a Python namespace package
我想知道如何导入 Python 2.7 命名空间包的本地测试版本。在此示例中,包 Ska.engarchive
是 Ska
根目录下的命名空间包。 (这种结构是遗留给我的)。
此示例表明,即使在设置 sys.path
以从本地目录开始后,安装包的版本也会被导入,而不是本地版本。
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'
我认为问题与 Python 2 中命名空间包的实现方式有关,无论如何命名空间路径总是位于列表的前面。但也许有一些解决方法?我花了一些时间研究 site
包文档,但也许我只是没有看到正确的东西。
以上示例使用的是 Anaconda Python 发行版。有趣的是,如果我使用来自 ActiveState 的 Python 的真正旧版本,该示例具有导入本地包的预期结果:
Python 2.7.1 (r271:86832, Feb 7 2011, 11:30:54)
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]: './Ska/engarchive/fetch_eng.pyc'
如有任何帮助,我们将不胜感激!
我能够使用 setuptools 的 namespace packages (but not the standard pkgutil method) 方法复制此行为。 Setuptools 将导入已安装的包,而 pkgutil 将导入本地包。 Setuptools 似乎从您期望的方式向后加载 __path__
(先安装,再安装本地)。例如,(请参阅底部示例以了解 nstest 的定义)
>>> import nstest
>>> nstest.__path__
['/home/caleb/.local/lib/python2.7/site-packages/nstest.foo-0.0.0-py2.7.egg/nstest', 'nstest']
解决这个问题的方法是将 __path__
前面的本地包添加到最右边的命名空间包中。例如,
>>> import nstest
>>> nstest.__path__.insert(0, 'nstest')
>>> from nstest import foo
>>> foo.__file__
'nstest/foo/__init__.py'
既然你在问题中说 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_resources
目录结构:
nstest.foo/
├─ setup.py
└─ nstest/
├─ __init__.py
└─ foo/
└─ __init__.py
nstest.foo/setup.py:
from setuptools import setup, find_packages
setup(name='nstest.foo', packages=find_packages())
nstest.foo/nstest/__init__.py:
__import__('pkg_resources').declare_namespace(__name__)
nstest.foo/nstest/foo/__init__.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'
我想知道如何导入 Python 2.7 命名空间包的本地测试版本。在此示例中,包 Ska.engarchive
是 Ska
根目录下的命名空间包。 (这种结构是遗留给我的)。
此示例表明,即使在设置 sys.path
以从本地目录开始后,安装包的版本也会被导入,而不是本地版本。
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'
我认为问题与 Python 2 中命名空间包的实现方式有关,无论如何命名空间路径总是位于列表的前面。但也许有一些解决方法?我花了一些时间研究 site
包文档,但也许我只是没有看到正确的东西。
以上示例使用的是 Anaconda Python 发行版。有趣的是,如果我使用来自 ActiveState 的 Python 的真正旧版本,该示例具有导入本地包的预期结果:
Python 2.7.1 (r271:86832, Feb 7 2011, 11:30:54)
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]: './Ska/engarchive/fetch_eng.pyc'
如有任何帮助,我们将不胜感激!
我能够使用 setuptools 的 namespace packages (but not the standard pkgutil method) 方法复制此行为。 Setuptools 将导入已安装的包,而 pkgutil 将导入本地包。 Setuptools 似乎从您期望的方式向后加载 __path__
(先安装,再安装本地)。例如,(请参阅底部示例以了解 nstest 的定义)
>>> import nstest
>>> nstest.__path__
['/home/caleb/.local/lib/python2.7/site-packages/nstest.foo-0.0.0-py2.7.egg/nstest', 'nstest']
解决这个问题的方法是将 __path__
前面的本地包添加到最右边的命名空间包中。例如,
>>> import nstest
>>> nstest.__path__.insert(0, 'nstest')
>>> from nstest import foo
>>> foo.__file__
'nstest/foo/__init__.py'
既然你在问题中说 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_resources
目录结构:
nstest.foo/
├─ setup.py
└─ nstest/
├─ __init__.py
└─ foo/
└─ __init__.py
nstest.foo/setup.py:
from setuptools import setup, find_packages
setup(name='nstest.foo', packages=find_packages())
nstest.foo/nstest/__init__.py:
__import__('pkg_resources').declare_namespace(__name__)
nstest.foo/nstest/foo/__init__.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'