编程语言
首页 > 编程语言> > python – 我应该如何在setup.py脚本中处理导入第三方库?

python – 我应该如何在setup.py脚本中处理导入第三方库?

作者:互联网

我正在开发一个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>\

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

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是安装我的软件包所需的软件包?

解决方法:

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

Is it acceptable to rely on third-party libraries like this in setup.py

是的,这是可以接受的,但通常这些应该最小化,特别是如果这些模块对最终用户没有明显的用途.没有人喜欢他们不需要或使用的包裹.

what is the recommended approach to using them?

基本上有3种选择:

>引导它们(例如使用pip以编程方式安装包).例如setuptools provides an ez_setup.py file,可用于引导setuptools.也许可以自定义下载和安装appdirs.
>在项目中包括它们(特别是如果它是一个小包装).例如,appdirs基本上只是一个文件模块.在项目中很容易复制和维护.当你这样做时,要非常小心许可问题!
>当无法导入它们并让用户安装它们时,优雅地失败.例如:

try:
    import appdirs
except ImportError:
    raise ImportError('this package requires "appdirs" to be installed. '
                      'Install it first: "pip install appdirs".')

标签:python,setup-py,python-packaging
来源: https://codeday.me/bug/20190622/1265019.html