gpt4 book ai didi

python-3.x - 为 CLI 脚本构建 python 包

转载 作者:行者123 更新时间:2023-12-05 07:00:01 27 4
gpt4 key购买 nike

我正在尝试构建我的第一个 python 包并将其发布到 PyPi。我的目标是通过 CLI 提供特定功能,以便最终用户可以通过 pip 安装它,例如 pip3 install my-package 并直接从终端使用它,例如 my-package -fa first_argument - second_argument.

假设我的包名为 fp-test-package。我制作了我的项目文件夹结构模型,您可以在此处找到 https://github.com/fabiopipitone/fp-test-package .

在模型中,我还作为要求插入了真实项目 (tqdm) 中所需的包之一,并保持完全相同的约定(外部文件夹和 github 存储库上的连字符,内部包的下划线,助手的相同位置和导入和实用程序等)。这样一来,如果它适用于模型,它也必须适用于真实项目。

这是项目的目录结构

fp-test-package
├── fp_test_package
│   ├── __init__.py
│   ├── fp_test_package.py
│   ├── helpers
│   │   ├── arguments_checkers.py
│   │   ├── csv_handlers.py
│   │   └── utility_functions.py
│   └── utils
│   ├── __init__.py
│   ├── CustomLogger.py
│   └── TqdmLoggingHandler.py
├── LICENSE
├── README.rst
├── requirements.txt
├── setup.py
├── docs
└── tests

这是 setup.py

from setuptools import setup, find_packages
with open("README.rst", "r") as fh:
long_description = fh.read()

setup(
name ='fp-test-package',
version ='0.0.1',
description='Simple test building a CLI tool package',
long_description=long_description,
long_description_content_type='text/x-rst',
license ='GPLv2',
packages = find_packages(),
entry_points ={
'console_scripts': [
'fp_test_package = fp_test_package.py:main'
]
},
classifiers =(
"Programming Language :: Python :: 3",
"License :: OSI Approved :: GNU General Public License v2",
"Operating System :: Linux",
),
keywords ='test packaging fabiopipitone',
install_requires = ['tqdm>=4.49.0'],
zip_safe = False
)

我尝试遵循一些关于如何构建和发布 CLI python 包的方法,然后我尝试从 fp-test-package 中使用 sudo python3 setup.py install code> 目录(与 setup.py 同级)。它似乎安装了包(我可以在 pip3 freeze 中找到条目 fp-test-package==0.0.1)但是如果我尝试 fp- test-package 在终端中它返回 fp-test-package: command not found,如果我尝试 fp_test_package 它返回:

Traceback (most recent call last):
File "/usr/local/bin/fp_test_package", line 11, in <module>
load_entry_point('fp-test-package==0.0.1', 'console_scripts', 'fp_test_package')()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 490, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2854, in load_entry_point
return ep.load()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2445, in load
return self.resolve()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2451, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
ModuleNotFoundError: No module named 'fp_test_package.py'

然后我使用 sudo pip3 uninstall fp_test_package,成功卸载了包。我删除了之前创建的 builddistfp_test_package.egg-info 目录并尝试使用 pip3 install -e 。(同样来自 fp-test-package)。它创建了 fp_test_package.egg-info 目录,但再次在它返回的控制台中运行 fp_test_package

Traceback (most recent call last):
File "/usr/local/bin/fp_test_package", line 11, in <module>
load_entry_point('fp-test-package==0.0.1', 'console_scripts', 'fp_test_package')()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 490, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2854, in load_entry_point
return ep.load()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2445, in load
return self.resolve()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2451, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
ModuleNotFoundError: No module named 'fp_test_package.py'

现在,我错过了什么?我想简单地打包和安装它,以便当用户键入 fp-test-packagefp_test_package 它返回有关 --export_path< 的错误 需要参数(意味着脚本已正确启动),就像我从控制台调用它时一样:

$ python3 fp_test_package/fp_test_package.py

usage: fp_test_package.py [-h] -ep EXPORT_PATH [-sa SECOND_ARGUMENT] [-ta THIRD_ARGUMENT]
fp_test_package.py: error: the following arguments are required: -ep/--export_path

我该怎么做?

编辑:我注意到 @Dustin 然后指出了有关 setup.py 的内容。事实上,我的一位同事 PRed 更改了 console_scripts 部分的虚拟仓库。现在,在我的同事机器上,一切似乎都按预期工作。在我的平台上,在拉取 repo 并重新运行 python3 setup.py install 后,当从控制台调用 fp_test_package 时,它返回以下内容:

Traceback (most recent call last):
File "/usr/local/bin/fp_test_package", line 11, in <module>
load_entry_point('fp-test-package==0.0.1', 'console_scripts', 'fp_test_package')()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 490, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2854, in load_entry_point
return ep.load()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2445, in load
return self.resolve()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2451, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "/usr/local/bin/fp_test_package.py", line 4, in <module>
__import__('pkg_resources').run_script('fp-test-package==0.0.1', 'fp_test_package.py')
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 667, in run_script
self.require(requires)[0].run_script(script_name, ns)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 1452, in run_script
raise ResolutionError(
pkg_resources.ResolutionError: Script 'scripts/fp_test_package.py' not found in metadata at '/usr/local/lib/python3.8/dist-packages/fp_test_package-0.0.1-py3.8.egg/EGG-INFO'

有什么想法吗?

最佳答案

你的 setup.py 有:

  entry_points ={ 
'console_scripts': [
'fp_test_package = fp_test_package.py:main'
]
},

这等同于以下导入:

from fp_test_package.py import main as fp_test_package

问题是您没有fp_test_package.py 模块,您有一个fp_test_package 模块(包含__init__.py 的目录> 文件)包含一个 fp_test_package 子模块(模块名称不包括扩展名)。

假设您的 fp_test_package.py 文件定义了一个 main 函数,您可以将其更改为:

  entry_points ={ 
'console_scripts': [
'fp_test_package = fp_test_package.fp_test_package:main'
]
},

或者您可以将main 函数移动到fp_test_package/__init__.py,这样它就可以:

  entry_points ={ 
'console_scripts': [
'fp_test_package = fp_test_package:main'
]
},

关于python-3.x - 为 CLI 脚本构建 python 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64225196/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com