为什么当前工作目录会影响 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

分开