我想创建一个python软件包,在构建运行时将从其git repo中克隆它,因此我将把源包含在构建代理中。然后,我想将python软件包作为命令行工具运行,该软件包称为environment_manager
。
起初我以为我会按照教程来创建一个简单的setup.py
,尽管事实证明这比我想象的要困难得多,而且每当我运行python setup.py install --force
时我都无法使用安装的软件包,通常找不到模块或在键入命令时无法识别该命令。
我发现,如果仅使用pip install .
进行安装,则实际上可以从命令行使用该工具,并且可以正常工作。我不知道有什么区别,或者为什么这仅在执行pip install方法时有效。
下面是setup.py
文件,我看不出有什么问题:
from setuptools import setup, find_packages, find_namespace_packages
import pathlib
here = pathlib.Path(__file__).parent.resolve()
# Get the long description from the README file
long_description = (here / 'README.MD').read_text(encoding='utf-8')
setup(
name='environment_manager',
version='1.0.0',
package_dir={'': 'src'},
packages=find_namespace_packages(where='src', include='environment_manager.*'),
python_requires='>=3.8, <4',
install_requires=['boto3', 'botocore', 'pyyaml'],
extras_require={
'dev': ['pre-commit', 'black', 'pylint'],
'test': ['pytest', 'pytest-mock', 'coverage'],
},
entry_points={
'console_scripts': [
'environment-manager=environment_manager.environment_controller:main',
],
}
)
我的项目结构如下:
environment_manager
/src
conf/
environment_manager/
environment_controller.py
config_parser.py
command.py
test/
unit_tests.py
我认为从命令行安装和运行该工具的正确方法是使用setup.py
和setuptools
,但如果将其安装在以下位置,它似乎要容易得多并且可以正常工作点子。
在pip
上使用setup.py
进行安装是否正确(当键入pip list
时,软件包同时出现),并且setup.py
脚本是否存在问题?该脚本来自pypa示例项目,我删除了大部分不需要的内容。
答案 0 :(得分:2)
pip
是一个软件包管理器,可以帮助安装,管理和卸载Python软件包。它在PyPI上搜索它们,下载它们,然后运行其setup.py
脚本。
由于您提到可以在安装pip
之后运行二进制可执行文件,但不能进行setup.py
安装,因此它们中的每一个都可能会将二进制文件安装到单独的位置。
我要检查的一件事是您使用的是同一版本的Python中的python
和pip
,例如:
% python --version
Python 3.8.6
% pip --version
pip 20.1.1 from /usr/lib/python3.8/site-packages/pip (python 3.8)
如果其中列出了不同的Python版本,则它们可能会安装到两个单独的目录-一个在您的PATH
环境变量中,另一个不在。
接下来,我将在每种安装方法之后检查pip list -v
,因为这应该列出一个Location
标头,告诉您该软件包的安装位置。
答案 1 :(得分:1)
setup.py 是一个python文件,通常告诉您要安装的模块/软件包已与Distutils打包并分发,Distutils是分发Python模块的标准。这使您可以轻松安装Python软件包。通常只需写:$ pip install .
换句话说, setup.py 是打包文件,而 pip 是包管理器,因此您应该具有 setup.py 文件能够使用 pip 安装。