【问题标题】:Calling function in setup.py (using tox)在 setup.py 中调用函数(使用 tox)
【发布时间】:2014-07-28 23:37:07
【问题描述】:

我需要我的setup.py 来调用另一个文件中的函数。我知道这可以通过设置cmdclass 来完成,例如:

import my_module

class Install(_install):
    def run(self):
        _install.run(self)
        my_module.do_stuff()

setup(name='foo',
        cmdclass={'install': Install},
        )

但我使用的是tox,它似乎不接受来自setup.py 的导入(它只是说找不到模块)。 为了让 tox 运行,我可以把它放在tox.ini 中:

commands = path_to_my_module.py

它会运行得很好。

问题

我怎样才能让我的setup.py 调用我的函数而不用 tox 抱怨它?

【问题讨论】:

  • 我不知道“似乎不接受来自setup.py 的导入”是什么意思。但听起来tox 没有安装到您用来运行setup.py 的Python 安装的站点包中。 (由于tox 是一个虚拟环境工具,它可能出于某种原因故意不在其虚拟环境中提供自己的功能——但如果是这样,我确信这种情况必须在文档或常见问题解答中涵盖...... )

标签: python python-2.7 distutils tox


【解决方案1】:

tox 创建一个 virtualenv 并将您的模块安装到其中。因为依赖项列在setup.py 中,所以直到调用setup.py 来确定它们是什么之后才会安装它们。所以在setup.py 第一次执行时,你闪亮的新虚拟环境中没有安装任何东西。

根据文档https://testrun.org/tox/latest/config.html,考虑在tox.ini 中使用deps 配置选项,因为这些软件包将在被测软件包之前安装。

【讨论】:

  • 这是有道理的。但我并没有尝试导入外部模块,我需要从我即将设置的模块中导入另一个文件。所以它不是那种意义上的依赖。
  • 好的。我猜我把另一个文件误读为另一个包。我进入了一个我设置了 tox 的小项目,并添加了一个自定义安装命令,该命令调用与 setup.py 相同目录中的另一个模块。它导入并运行。确保一切都是最新的?并确保您导入的是from setuptools.command.install import install 而不是from distutils.command.install import install,尽管对我来说后者会导致不同的错误。
  • 是否有任何可能 my_module 没有包含在您的包清单中,并且它在 commands 中有效,因为它在您的路径中的某个地方?
  • 清单看起来不错。我使用的是 distutils,而不是 setuptools。为什么会有问题?
  • 对于特定的导入,使用 distutils 导致失败,使用 setuptools 解决的“选项 --single-version-externally-managed”无法识别。
猜你喜欢
  • 1970-01-01
  • 2013-11-07
  • 2017-04-11
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 2016-04-03
  • 2015-07-04
  • 1970-01-01
相关资源
最近更新 更多