我应该如何处理在 setup.py 脚本中导入第三方库?
How should I handle importing third-party libraries within my setup.py script?
我正在开发一个 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
,这对我计算 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
是安装我的包所必需的包?
我忽略了这个答案中的许可问题。在真正发布之前,您肯定需要考虑这些因素。
Is it acceptable to rely on third-party libraries like this in setup.py
是的,这是可以接受的,但通常应尽量减少这些,尤其是当这些模块对最终用户没有明显用途时。没有人喜欢拥有他们不需要或不使用的包。
what is the recommended approach to using them?
基本上有3种选择:
Bootstrap 它们(例如使用 pip
以编程方式安装包)。例如setuptools
provides an ez_setup.py
file可以用来bootstrapsetuptools
。也许可以自定义下载安装appdirs
.
在您的项目中包含它们(特别是如果它是一个小包)。例如 appdirs
基本上只是一个文件模块。在您的项目中很容易复制和维护。这样做时要非常小心许可问题!
无法导入它们并让用户安装它们时优雅地失败。例如:
try:
import appdirs
except ImportError:
raise ImportError('this package requires "appdirs" to be installed. '
'Install it first: "pip install appdirs".')
您可以在依赖项列表中提及 install_requires。请查看 python 打包指南 here。你也可以提供一个 requirements.txt 文件,这样它就可以 运行 使用 "pip install -r"
如果 import
失败,您可以使用 pip
以编程方式安装软件包:
try:
import appdirs
except ImportError:
import pip
pip.main(['install', 'appdirs'])
import appdirs
在某些情况下,您可能需要使用 importlib
或 __import__
在 pip.main
之后导入包或引用 PATH
变量。如果用户真的想在安装该软件包之前安装该软件包,那么包含一个验证也是值得的。
我使用了很多来自 "Installing python module within code" 的例子,我还没有亲自尝试在 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
,这对我计算 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
是安装我的包所必需的包?
我忽略了这个答案中的许可问题。在真正发布之前,您肯定需要考虑这些因素。
Is it acceptable to rely on third-party libraries like this in setup.py
是的,这是可以接受的,但通常应尽量减少这些,尤其是当这些模块对最终用户没有明显用途时。没有人喜欢拥有他们不需要或不使用的包。
what is the recommended approach to using them?
基本上有3种选择:
Bootstrap 它们(例如使用
pip
以编程方式安装包)。例如setuptools
provides anez_setup.py
file可以用来bootstrapsetuptools
。也许可以自定义下载安装appdirs
.在您的项目中包含它们(特别是如果它是一个小包)。例如
appdirs
基本上只是一个文件模块。在您的项目中很容易复制和维护。这样做时要非常小心许可问题!无法导入它们并让用户安装它们时优雅地失败。例如:
try: import appdirs except ImportError: raise ImportError('this package requires "appdirs" to be installed. ' 'Install it first: "pip install appdirs".')
您可以在依赖项列表中提及 install_requires。请查看 python 打包指南 here。你也可以提供一个 requirements.txt 文件,这样它就可以 运行 使用 "pip install -r"
如果 import
失败,您可以使用 pip
以编程方式安装软件包:
try:
import appdirs
except ImportError:
import pip
pip.main(['install', 'appdirs'])
import appdirs
在某些情况下,您可能需要使用 importlib
或 __import__
在 pip.main
之后导入包或引用 PATH
变量。如果用户真的想在安装该软件包之前安装该软件包,那么包含一个验证也是值得的。
我使用了很多来自 "Installing python module within code" 的例子,我还没有亲自尝试在 setup.py
文件中使用它,但看起来它可以解决你的问题。