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

2024-05-16 17:57:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

proj/
  dists/
  doc/
  src/
    __init__.py
    xyz.py
    abc.py
  test/
  setup.py

正如您所看到的,项目的所有内容都在src子文件夹中。如何从src文件夹中创建distutils分发包?

我天真的想法是,遵循the tutorial,应该是这样写setup.py

#omitting basics
setup(
   name='proj',
   packages=['src'],
   package_dir={'proj':'src'}
)

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


Tags: 项目pytestsrc文件夹内容docinit
3条回答

在调用setup函数之前,可以尝试将src文件夹添加到PYTHONPATH

import sys, os
src_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'src')
sys.path.append(src_path)

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

os.chdir(src_path)

在那之后,一切都会好起来的。

其他一些打包应用程序的工具支持从内部打包。我以为是setuptools,原来是PyInstaller。但基本上,这是应该做的,只够你的包裹直接进口。

原来distutils有package_dir指令。这是您应该使用的,但是它可能只通过将您的包添加到PYTHONPATH来工作。

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

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

  • src包符号链接为proj(并在发送时忽略它),它将在框外工作,但已损坏
  • src更改为proj
  • src中创建子目录proj,并使用以下选项:
packages=['proj'],
package_dir={'proj': 'src/proj'},

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

proj/
  src/
    proj/
      __init__.py
      xyz.py
      abc.py
  setup.py

并将setup.py更改为:

# ...
setup(
   name='proj',
   packages=['proj'],
   package_dir={'':'src'}
)

distutils不需要它,但其他工具可能希望__init__.py文件的父目录名与Python包名相同,即本例中的proj

相关问题 更多 >