为什么当前工作目录会影响setup.py的安装路径?如何预防?

时间:2017-11-13 12:41:09

标签: python python-3.6 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中安装以下结构:

.../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。

1 个答案:

答案 0 :(得分:1)

您的setup.py不包含任何路径,但似乎只能通过find_packages找到这些文件。所以当然这取决于你运行它的位置。 setup.py并不严格依赖于其位置。当然,您可以chdirbasename中的设置文件路径的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目录)