我在this guide之后创建了一个自定义python包,所以我有以下结构:
mypackage/ <-- VCS root
mypackage/
submodule1/
submodule2/
setup.py
setup.py包含与指南中完全相同的信息:
from setuptools import setup, find_packages
setup(name='mypackage',
version='0.1',
description='desc',
url='vcs_url',
author='Hodossy, Szabolcs',
author_email='myemail@example.com',
license='MIT',
packages=find_packages(),
install_requires=[
# deps
],
zip_safe=False)
我注意到如果我进入setup.py所在的文件夹,然后在虚拟环境中调用python setup.py install
,则在site-packages中安装以下结构:
.../site-packages/mypackage-0.1-py3.6.egg/mypackage/
submodule1/
submodule2/
但如果我从python mypackage/setup.py install
这样的一个文件夹中调用它,那么结构如下:
.../site-packages/mypackage-0.1-py3.6.egg/mypackage/
mypackage/
submodule1/
submodule2/
后面这个会破坏我模块的所有导入,因为子模块的路径不同。
你能解释一下这里发生了什么以及如何防止这种行为吗?
这适用于Windows和Linux上的Python 3.6。
答案 0 :(得分:1)
您的setup.py不包含任何路径,但似乎只能通过find_packages
找到这些文件。所以当然这取决于你运行它的位置。 setup.py并不严格依赖于其位置。当然,您可以chdir
对basename
中的设置文件路径的sys.argv[0]
执行操作,但这相当丑陋。
问题是,为什么要以这种方式构建它?它看起来更像你想要一个像
这样的结构mypackage-source
mypackage
submodule1
submodule2
setup.py
然后从工作目录执行setup.py。如果你想能够从任何地方运行它,更好的解决方法是在它旁边放一个shellcript,比如
#!/bin/sh
cd ``basename $0``
python setup.py $@
将运行setup.py
的更改任务分离到正确的目录(这里我假设workdir中的setup.py目录)