我正在开发一个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
中的第三方库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
,或者我应该只记录entitySearchRepository.save(entity);
entitySearchRepository.delete(id);
是安装我的软件包所需的软件包?
答案 0 :(得分:2)
我在这个答案中忽略了许可问题。在你真正发布之前,你肯定需要考虑这些因素。
在setup.py
中依赖这样的第三方库是否可以接受
是的,这是可以接受的,但通常这些应该最小化,特别是如果这些模块对最终用户没有明显的用途。没有人喜欢拥有他们不需要或不需要的包裹。
使用它们的推荐方法是什么?
基本上有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".')
答案 1 :(得分:1)
您可以提及带有依赖项列表的install_requires。请查看python包装指南here。您还可以提供requirements.txt文件,以便可以使用&#34; pip install -r&#34;
立即运行它。答案 2 :(得分:1)
如果pip
失败,您可以使用import
以编程方式安装软件包:
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
文件中使用此示例,但看起来它可能是您问题的解决方案。