10

我正在开发一个 Python 应用程序,并且正在分支一个版本。我在公司服务器上设置了一个 PyPI 服务器,并将我的包的源代码分发复制到它上面。

我检查了该软件包是否托管在服务器上,然后尝试将其安装在我的本地开发机器上。我最终得到了这个输出:

$ pip3 install --trusted-host 172.16.1.92 -i http://172.16.1.92:5001/simple/ <my-package>
Collecting <my-package>
  Downloading http://172.16.1.92:5001/packages/<my-package>-0.2.0.zip
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\<me>\AppData\Local\Temp\pip-build-ubb3jkpr\<my-package>\setup.py", line 9, in <module>
        import appdirs
    ModuleNotFoundError: No module named 'appdirs'

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in C:\Users\<me>\AppData\Local\Temp\pip-build-ubb3jkpr\<my-package>\

appdirs原因是我试图在 my中导入第三方库setup.py,这对我计算data_files参数是必要的setup()

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

import os
from collections import defaultdict

import appdirs
from <my-package>.version import __version__ as <my-package>_version

APP_NAME = '<my-app>'
APP_AUTHOR = '<company>'
SYSTEM_COMPONENT_PLUGIN_DIR = os.path.join(appdirs.user_data_dir(APP_NAME, APP_AUTHOR), 'components')

# ...

setup(
    # ...
    data_files=component_files,
)

但是,我没有appdirs在我的本地开发机器上安装它,我也不希望最终用户拥有它。

在 中依赖这样的第三方库是否可以接受setup.py,如果可以,推荐使用它们的方法是什么?有没有一种方法可以确保appdirs在导入之前安装它setup.py,或者我应该只记录appdirs安装我的包所需的包?

4

3 回答 3

3

我在这个答案中忽略了许可问题。在真正发布之前,您肯定需要考虑这些因素。

在 setup.py 中依赖这样的第三方库是否可以接受

是的,这是可以接受的,但通常应该尽量减少这些,特别是如果这些模块对最终用户没有明显用途。没有人喜欢拥有他们不需要或使用的软件包。

使用它们的推荐方法是什么?

基本上有3个选项:

  • 引导它们(例如用于pip以编程方式安装包)。例如setuptools提供了一个ez_setup.py可用于引导的文件setuptools。也许可以自定义下载和安装appdirs

  • 将它们(特别是如果它是一个小包)包含在您的项目中。例如appdirs基本上只是一个单一的文件模块。在您的项目中很容易复制和维护。这样做时要非常小心许可问题!

  • 当无法导入它们并让用户安装它们时,优雅地失败。例如:

    try:
        import appdirs
    except ImportError:
        raise ImportError('this package requires "appdirs" to be installed. '
                          'Install it first: "pip install appdirs".')
    
于 2017-06-04T15:53:09.640 回答
3

如果失败,您可以使用pip以编程方式安装软件包:import

try:
    import appdirs
except ImportError:
    import pip
    pip.main(['install', 'appdirs'])
    import appdirs

在某些情况下,您可能需要在或引用变量之后使用importlib__import__导入包。如果用户真的想在安装该软件包之前安装它,那么包含验证也是值得的。pip.mainPATH

我使用了“在代码中安装 python 模块”中的很多示例,我没有亲自尝试在setup.py文件中使用它,但看起来它可以解决您的问题。

于 2017-06-06T23:08:54.677 回答
1

您可以在依赖项列表中提及 install_requires。请在此处查看 python 打包指南。您还可以提供一个 requirements.txt 文件,以便可以使用“pip install -r”立即运行它

于 2017-06-04T17:23:15.763 回答