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
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在这种情况下.
这是由于在此处报告的setuptools中的错误所致:https://github.com/pypa/setuptools/issues/250
基本上,它可以工作,但不能在开发模式下工作。现在,您有3个解决方案:
src软件包符号链接为proj(在调试时忽略它),它可以开箱即用,但是很脏src为projproj中src,并使用以下选项:包= ['proj'],
package_dir = {'proj':'src / proj'},
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.