糟糕的 Python 包组织在我的路径中安装了一个“测试”包? (蟒蛇)
Posted
技术标签:
【中文标题】糟糕的 Python 包组织在我的路径中安装了一个“测试”包? (蟒蛇)【英文标题】:Bad Python package organization installed a `tests` package to my path? (Anaconda) 【发布时间】:2017-11-10 17:51:14 【问题描述】:不知何故(由于一些不好的建议)我相信bitten by using a shoddy 我的项目目录的组织。
目前看起来像这样(好!):
\projectname
setup.py
LICENSE
MANIFEST.in
README.rst
CHANGELOG.rst
\src
\projectname
__init__.py
\tests
__init__.py
test1.py
然而,它曾经看起来像这样(糟糕!):
\package_name
setup.py
LICENSE
MANIFEST.in
README.rst
CHANGELOG.rst
\projectname <--- main package at top level
__init__.py
\tests
test1.py
在修复我的劣质设置之前,我使用的是项目的可编辑安装 (python setup.py develop
)。我随后删除了(pip uninstall my_package
)多次安装(并重新添加)。
尽管删除了它,但我现在发现我似乎有一个名为 tests
的包可用于导入!并且包路径指向我项目的目录:
>>> import tests
>>> tests.__path__
_NamespacePath(['c:\\users\\username\\projects\\projectname\\tests'])
我猜这是由于使用初始损坏的包组织安装我的包而发生的。
如何从我的路径中删除这个tests
“包”?我使用的是 Anaconda 4.3(最新版本)。 pip uninstall tests
不成功。
注意:我的项目也已发布到 pypi(项目名称:parmatter),我确实从那里安装了一次作为测试,但只是在使用修改后的项目组织结构之后,所以我不认为这是原因。如果有人想安装它并查看它是否会导致相同的问题,那至少可以帮助我确定原因。
项目回购:https://github.com/Ricyteach/parmatter
来源分布:parmatter-0.0.5.tar.gz
编辑
python -m site
的结果如下。
C:\>python -m site
sys.path = [
'C:\\',
'C:\\Users\\ricky\\Anaconda3\\python36.zip',
'C:\\Users\\ricky\\Anaconda3\\DLLs',
'C:\\Users\\ricky\\Anaconda3\\lib',
'C:\\Users\\ricky\\Anaconda3',
'C:\\Users\\ricky\\Anaconda3\\lib\\site-packages',
'C:\\Users\\ricky\\Anaconda3\\lib\\site-packages\\Sphinx-1.5.6-py3.6.egg',
'c:\\users\\ricky\\projects\\parmatter',
'C:\\Users\\ricky\\Anaconda3\\lib\\site-packages\\win32',
'C:\\Users\\ricky\\Anaconda3\\lib\\site-packages\\win32\\lib',
'C:\\Users\\ricky\\Anaconda3\\lib\\site-packages\\Pythonwin',
'C:\\Users\\ricky\\Anaconda3\\lib\\site-packages\\setuptools-27.2.0-py3.6.egg',
]
USER_BASE: 'C:\\Users\\ricky\\AppData\\Roaming\\Python' (doesn't exist)
USER_SITE: 'C:\\Users\\ricky\\AppData\\Roaming\\Python\\Python36\\site-packages' (doesn't exist)
ENABLE_USER_SITE: True
看来我需要从site
中删除项目目录...我该怎么做?它最初是如何到达那里的?
【问题讨论】:
我觉得你可以试试pip uninstall tests
@PaulH 不,不起作用。
【参考方案1】:
问题是由 OP 在开发模式下安装旧版本的项目引起的,使用系统 Python 解释器而不是 venv(提示:不要那样做)。这会在easy-install.pth
中创建一行,从而使项目目录在sys.path
中可用。
在您的site-packages
目录中找到easy-install.pth
文件,并删除所有像这样开头的行:
c:\\users\\username\\projects
至于你的项目结构,
我建议您从 tests 子目录中删除 __init__.py
。 这不是必需的,这意味着如果您使用 find_packages()
助手,则必须明确排除 tests
。
我安装了您的 v0.0.5 发行版,该版本没有出现问题。您的 Python 2 发行版已损坏,您应该在 setup.py
设置调用中包含 python_requires='>=3'
,以便生成适当的元数据以防止 pip 尝试在 Python 2 上安装它。
【讨论】:
嗯。模块对象没有__file__
属性。它有一个__package__
属性,但它直接指向我的项目测试目录,我无法删除它(显然)。
是的,无论我在哪个目录,它都会导入。顺便说一句:我在site-packages
目录中查找了.egg-link
文件,但没有。
是的,在tests
中有__init__.py
是一个错误。我不再有一个,但问题仍然存在。
它是仅从您的 venv 中导入,还是在您的系统 python 中也导入?请 cd 到 /tmp 并编辑以在您的问题中包含 python -m site
的输出。
不,这些东西是由.pth
文件完成的,site.py
使用这些文件,并且可能不会通过重新启动来修复。见here。在您的磁盘上找到easy-install.pth
文件并删除有关它的行。以上是关于糟糕的 Python 包组织在我的路径中安装了一个“测试”包? (蟒蛇)的主要内容,如果未能解决你的问题,请参考以下文章
我在 Angular 8 中安装了引导程序但无法正常工作。为啥?