糟糕的 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='&gt;=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 中安装了引导程序但无法正常工作。为啥?

ScintillaNET 控件不显示语法着色?

安装后找不到lmdb包

Node.JenCourse错误

我的项目中安装了哪个版本的Entity Framework?

在 windows 中使用 cmd 创建一个 python 文件