为什么当前工作目录会影响 setup.py 的安装路径?如何防止这种情况?
Why current working directory affects install path of setup.py? How to prevent that?
我在 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/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/
后一个会破坏我模块的所有导入,因为子模块的路径不同。
你能解释一下这里发生了什么以及如何防止这种行为吗?
Python 3.6 在 Windows 和 Linux 上都遇到过这种情况。
您的 setup.py 不包含任何路径,但似乎只能通过 find_packages
找到文件。所以当然这取决于你从哪里 运行 它。 setup.py 并不严格依赖于它的位置。当然,您可以对 sys.argv[0]
中的安装文件路径的 basename
执行 chdir
之类的操作,但这相当难看。
问题是,您为什么要那样构建它?它看起来更像是你想要一个像
这样的结构
mypackage-source
mypackage
submodule1
submodule2
setup.py
然后从工作目录执行setup.py。如果你希望能够从任何地方 运行 它,更好的解决方法是在它旁边放一个 shellscript,比如
#!/bin/sh
cd ``basename [=11=]``
python setup.py $@
将更改到正确目录的任务(这里我假设工作目录中带有 setup.py 的目录)与 运行ning setup.py
分开
我在 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/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/
后一个会破坏我模块的所有导入,因为子模块的路径不同。
你能解释一下这里发生了什么以及如何防止这种行为吗?
Python 3.6 在 Windows 和 Linux 上都遇到过这种情况。
您的 setup.py 不包含任何路径,但似乎只能通过 find_packages
找到文件。所以当然这取决于你从哪里 运行 它。 setup.py 并不严格依赖于它的位置。当然,您可以对 sys.argv[0]
中的安装文件路径的 basename
执行 chdir
之类的操作,但这相当难看。
问题是,您为什么要那样构建它?它看起来更像是你想要一个像
这样的结构mypackage-source
mypackage
submodule1
submodule2
setup.py
然后从工作目录执行setup.py。如果你希望能够从任何地方 运行 它,更好的解决方法是在它旁边放一个 shellscript,比如
#!/bin/sh
cd ``basename [=11=]``
python setup.py $@
将更改到正确目录的任务(这里我假设工作目录中带有 setup.py 的目录)与 运行ning setup.py
分开