python中scripts_在setup.py中使用“scripts”关键字的Python setuptools

本文探讨了Python打包工具setuptools的工作原理,特别是`scripts`参数的用途。`scripts`参数用于指定可执行脚本,使得在安装项目后,这些脚本可以作为命令行工具直接运行。示例代码展示了如何配置`setup.py`文件,包括设置项目元数据、依赖项以及包含的文件。通过理解这个参数,开发者能够更好地打包和分发Python应用程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我试图理解python打包是如何使用setuptools工作的。

函数的参数之一是脚本。

文档没有指定该参数的用途。任何帮助都太好了!

下面是一些使用脚本的示例代码。from setuptools import setup, find_packages

setup(

name="HelloWorld",

version="0.1",

packages=find_packages(),

scripts=['say_hello.py'],

# Project uses reStructuredText, so ensure that the docutils get

# installed or upgraded on the target machine

install_requires=['docutils>=0.3'],

package_data={

# If any package contains *.txt or *.rst files, include them:

'': ['*.txt', '*.rst'],

# And include any *.msg files found in the 'hello' package, too:

'hello': ['*.msg'],

},

# metadata for upload to PyPI

author="Me",

author_email="me@example.com",

description="This is an Example Package",

license="PSF",

keywords="hello world example examples",

url="http://example.com/HelloWorld/", # project home page, if any

# could also include long_description, download_url, classifiers, etc.

)

colcon build --packages-select smartcar_demo Starting >>> smartcar_demo Traceback (most recent call last):mo - 0.1s] File "<string>", line 1, in <module> File "/usr/lib/python3.10/distutils/core.py", line 225, in run_setup raise RuntimeError(("'distutils.core.setup()' was never called -- " RuntimeError: 'distutils.core.setup()' was never called -- perhaps 'setup.py' is not a Distutils setup script? --- stderr: smartcar_demo Traceback (most recent call last): File "/usr/lib/python3/dist-packages/colcon_core/executor/__init__.py", line 91, in __call__ rc = await self.task(*args, **kwargs) File "/usr/lib/python3/dist-packages/colcon_core/task/__init__.py", line 93, in __call__ return await task_method(*args, **kwargs) File "/usr/lib/python3/dist-packages/colcon_ros/task/ament_python/build.py", line 51, in build setup_py_data = get_setup_data(self.context.pkg, env) File "/usr/lib/python3/dist-packages/colcon_core/task/python/__init__.py", line 20, in get_setup_data return dict(pkg.metadata[key](env)) File "/usr/lib/python3/dist-packages/colcon_ros/package_augmentation/ros_ament_python.py", line 57, in getter return get_setup_information( File "/usr/lib/python3/dist-packages/colcon_python_setup_py/package_identification/python_setup_py.py", line 249, in get_setup_information _setup_information_cache[hashable_env] = _get_setup_information( File "/usr/lib/python3/dist-packages/colcon_python_setup_py/package_identification/python_setup_py.py", line 296, in _get_setup_information result = subprocess.run( File "/usr/lib/python3.10/subprocess.py", line 526, in run raise CalledProcessError(retcode, process.args, subprocess.CalledProcessError: Command '['/usr/bin/python3', '-c', 'import sys;from contextlib import suppress;exec("with suppress(ImportError): from setuptools.extern.packaging.specifiers import SpecifierSet");exec("with suppress(ImportError): from packaging.specifiers import SpecifierS
最新发布
03-11
<think>好的,用户遇到了在colcon构建过程中出现的RuntimeError: 'distutils.core.setup()' was never called的问题,需要解决。首先,我需要回忆一下相关的Python打包和构建工具的知识。 这个问题通常发生在使用distutils或setuptools时,setup.py文件没有正确调用setup()函数。用户提到的colcon是ROS 2中常用的构建工具,它背后可能调用了catkin_make或ament工具。当Python包的setup.py文件没有正确配置时,可能会引发这个错误。 接下来,我需要检查用户提供的引用内容。引用[2]提到了在运行python setup.py build develop时出现的错误,具体指向build_ext.py的第87行。这可能与扩展模块构建有关,但用户的问题是关于setup()未被调用。引用[3]提到了distutils的dist.py文件中的错误,可能与setup()未正确执行有关。 可能的解决步骤包括: 1. 确保setup.py中正确导入了distutils.core.setupsetuptools.setup,并且调用了该函数。 2. 检查setup.py的结构,确认参数是否正确,比如name、version、packages等。 3. 检查是否有代码在setup()之前提前退出,比如条件判断或异常导致未执行到setup()。 4. 更新setuptools和distutils到最新版本,确保兼容性。 5. 确保项目结构符合Python包的标准结构,比如存在__init__.py文件。 6. 如果使用colcon,可能需要检查package.xml文件是否正确配置,特别是导出部分。 另外,用户提到的smartcar_demo可能是一个特定的ROS 2包,需要确认其setup.py是否存在问题。例如,可能存在代码逻辑错误,导致setup()函数没有被调用。例如,setup.py可能被错误地写成了只有在某个条件下才执行,如if __name__ == '__main__':之外的地方调用了setup(),或者在导入时提前返回了。 还需要考虑Python环境的问题,比如是否安装了正确版本的setuptools,或者是否存在环境变量冲突。用户可能在虚拟环境中使用了错误的依赖版本,导致构建工具无法正确执行setup()。 可能的解决方案包括: - 检查setup.py是否在最外层作用域调用了setup(),而不是在函数或条件块内部。 - 确保没有提前的sys.exit()或return语句导致setup()未被调用。 - 使用--no-build-isolation参数进行构建,避免环境隔离导致的问题。 - 重新安装setuptools和distutils,确保它们是最新的。 此外,用户可能需要查看完整的错误堆栈,确定setup.py执行到哪一步时失败。例如,错误可能出现在导入其他模块时,导致setup()根本没有被执行。这种情况下,需要检查导入的模块是否有语法错误或缺失依赖。 总结,解决该问题需要从setup.py的代码结构、依赖版本、构建命令参数以及项目配置等多个方面入手,逐步排查可能的原因。</think>### 解决方案:`colcon build`报错`RuntimeError 'distutils.core.setup()' was never called` #### **问题原因** 此错误通常由以下原因导致: 1. **`setup.py`未正确调用`setup()`函数**:Python包的`setup.py`文件中未在最外层作用域调用`distutils.core.setup()`或`setuptools.setup()`[^2][^3]。 2. **代码逻辑错误**:`setup()`被条件语句包裹或提前返回导致未执行。 3. **依赖版本冲突**:`setuptools`或`distutils`版本不兼容。 4. **项目结构问题**:缺少`__init__.py`文件或包路径配置错误。 --- #### **解决步骤** 1. **检查`setup.py`文件结构** 确保`setup.py`中有明确的`setup()`调用,例如: ```python from setuptools import setup setup( name="smartcar_demo", version="0.1", packages=["smartcar_demo"], install_requires=["..."] ) ``` **注意**: - 避免在函数或条件分支中调用`setup()`。 - 确保没有`sys.exit()`或`return`提前终止代码执行。 2. **验证项目结构** 确认包目录中包含`__init__.py`文件,例如: ``` smartcar_demo/ ├── __init__.py ├── package.xml └── setup.py ``` 3. **更新构建工具和依赖** 执行以下命令更新工具: ```bash pip install --upgrade setuptools wheel ``` 4. **尝试指定构建方式** 在`colcon build`中添加`--symlink-install`或禁用隔离构建: ```bash colcon build --symlink-install --packages-select smartcar_demo # 或 colcon build --no-build-isolation --packages-select smartcar_demo ``` 5. **检查`package.xml`配置** 确保ROS包的`package.xml`中声明了构建依赖: ```xml <buildtool_depend>ament_python</buildtool_depend> <depend>rclpy</depend> ``` --- #### **示例修复后的`setup.py`** ```python from setuptools import setup package_name = 'smartcar_demo' setup( name=package_name, version='0.0.1', packages=[package_name], data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), ], install_requires=['setuptools'], zip_safe=True, maintainer='Your Name', maintainer_email='your@email.com', description='SmartCar Demo Package', license='Apache-2.0', tests_require=['pytest'], entry_points={ 'console_scripts': [ 'smartcar_node = smartcar_demo.node:main', ], }, ) ``` --- #### **扩展问题** 1. **如何调试Python包的构建过程?** 直接运行`python setup.py build`查看详细报错。 2. **ROS 2中`colcon`和`ament`的关系是什么?** `colcon`是构建工具,`ament`是构建系统,两者协同管理ROS包的编译和依赖。 3. **`setuptools`与`distutils`有何区别?** `setuptools`是`distutils`的增强版,支持依赖管理和插件扩展[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值