pip 安装错误:包目录不存在

blu*_*ers 3 python pip

我看过类似的问题,但没有回答的运气,我有以下结构

??? README.rst
??? setup.py
??? my_package
    ??? conf.py
    ??? sub_module1
    ?   ??? __init__.py
    ?   ??? some_code.py
    ??? sub_module2
    ?   ??? __init__.py
    ?   ??? some_other_code.py
    ??? some_main_code.py
    ??? __init__.py
Run Code Online (Sandbox Code Playgroud)

我setup.py看起来像

..
setup(name=..
      ...
      packages=find_packages('my_package')
Run Code Online (Sandbox Code Playgroud)

安装时出现以下错误

    ERROR: Command errored out with exit status 1:
     command: /some_path/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-f7hcw6xa/setup.py'"'"'; __file__='"'"'/tmp/pip-req-build-f7hcw6xa/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-req-build-f7hcw6xa/pip-egg-info
         cwd: /tmp/pip-req-build-f7hcw6xa/
    Complete output (8 lines):
    running egg_info
    creating /tmp/pip-req-build-f7hcw6xa/pip-egg-info/my_package.egg-info
    writing /tmp/pip-req-build-f7hcw6xa/pip-egg-info/my_package.egg-info/PKG-INFO
    writing dependency_links to /tmp/pip-req-build-f7hcw6xa/pip-egg-info/my_package.egg-info/dependency_links.txt
    writing requirements to /tmp/pip-req-build-f7hcw6xa/pip-egg-info/my_package.egg-info/requires.txt
    writing top-level names to /tmp/pip-req-build-f7hcw6xa/pip-egg-info/my_package.egg-info/top_level.txt
    writing manifest file '/tmp/pip-req-build-f7hcw6xa/pip-egg-info/my_package.egg-info/SOURCES.txt'
    error: package directory 'sub_module1' does not exist
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
Run Code Online (Sandbox Code Playgroud)

如果sub_module1在那里,并且其中有一个init .py 文件 - 为什么安装不能识别它?

gab*_*e-h 5

编辑:感谢 sinoroc指出当然不止一个解决此问题的方法。

解决方案#1

错误消息告诉您解释器认为您有一个名为“sub_module1”的包。由于这显然是一个模块而不是包,您可以看到您的目录结构中缺少一个级别,因为您当前尝试使用 find_packages() 的方式。

您可以在项目结构中添加一个“src”文件夹。那么你将不得不做这样的事情:

mkdir src
mv my_package src/
Run Code Online (Sandbox Code Playgroud)

在 setup.py 中将 find_packages 指向 'src' 而不是 'my_package':

packages=find_packages(where="src"),
package_dir={'': 'src'},
Run Code Online (Sandbox Code Playgroud)

解决方案#2

或者,您可以尝试使用不带任何参数的 find_packages(如https://packaging.python.org/tutorials/packaging-projects/所建议的):

packages=find_packages()
Run Code Online (Sandbox Code Playgroud)

当我设置我的包时,这对我不起作用,从长远来看,无论如何我会更好地使用 src/ 解决方案。这就是为什么我的初始版本的答案假设您要添加 src/.

个人结论

请记住,如果您将来可能有更多的包,想要将脚本添加到您的包中或做任何比一个包更复杂的事情,那么使用 src/ 可能是明智的。我知道这多年来一直是讨论的话题,这就是为什么我将其称为“个人结论”。