setup.py:将src包重命名为项目名称

eri*_*ork 24 python distutils python-2.7

假设你有一个名为的项目proj,在这个项目中你有以下结构:

proj/
  dists/
  doc/
  src/
    __init__.py
    xyz.py
    abc.py
  test/
  setup.py
Run Code Online (Sandbox Code Playgroud)

如您所见,项目的所有内容都在src子文件夹中.如何从src文件夹中制作distutils发行包?

我的天真想法,按照教程,将编写setup.py如下:

#omitting basics
setup(
   name='proj',
   packages=['src'],
   package_dir={'proj':'src'}
)
Run Code Online (Sandbox Code Playgroud)

但是在将生成的软件包安装到我的系统之后,我仍然需要导入src.xyz而不是导入proj.xyz,这将是目标和预期的结果.

use*_*245 11

正确的设置是:

#omitting basics
setup(
   name='proj',
   packages=['proj'],
   package_dir={'proj':'src'}
)
Run Code Online (Sandbox Code Playgroud)

src 文件夹应包含__init__.py(如果文件为空,则默认导出所有内容)

在另一个项目中:requirements.txt:

../relativePathToProject或姓名package:version

  • 对我来说,使用 python 3.8 和 setuptools 58.0.4,这仍然将包安装为“src”而不是“proj”。 (2认同)
  • 这似乎在 python3.10 中不起作用,pip 包称为“proj”,但在 python 中我仍然需要执行“import src” (2认同)

jfs*_*jfs 10

您可以通过将Python包文件放入proj/目录来修复它:

proj/
  src/
    proj/
      __init__.py
      xyz.py
      abc.py
  setup.py
Run Code Online (Sandbox Code Playgroud)

setup.py改为:

# ...
setup(
   name='proj',
   packages=['proj'],
   package_dir={'':'src'}
)
Run Code Online (Sandbox Code Playgroud)

distutils不需要它,但是其他工具可能希望__init__.py文件的父目录名与Python包名相同,即proj在这种情况下.


IxD*_*Day 6

这是由于在此处报告的setuptools中的错误所致:https//github.com/pypa/setuptools/issues/250

基本上,它可以工作,但不能在开发模式下工作。现在,您有3个解决方案:

  • src软件包符号链接为proj(在调试时忽略它),它可以开箱即用,但是很脏
  • 从更改srcproj
  • 创建一个子目录projsrc,并使用以下选项:
包= ['proj'],
package_dir = {'proj':'src / proj'},

  • 问题现已关闭 3.5+ (3认同)

jad*_*k94 -6

您可以在调用该函数之前尝试将src文件夹添加到:PYTHONPATHsetup

import sys, os
src_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'src')
sys.path.append(src_path)
Run Code Online (Sandbox Code Playgroud)

另外,为了安全起见,您可以更改工作目录:

os.chdir(src_path)
Run Code Online (Sandbox Code Playgroud)

之后,一切应该就OK了。

用于打包应用程序的其他一些工具从内部支持这一点。我以为是setuptools,原来是PyInstaller。但基本上,这就是应该做的,足以让你的包直接导入。

事实证明 distutils 有该package_dir指令。这就是您应该使用的,但只需将您的包添加到PYTHONPATH.