如何将Python项目配置为兼具CLI命令与可导入模块的结构
解决方案
1. 重构项目结构(消除冗余层级)
先把现有嵌套冗余的文件结构调整为更简洁的形式,避免导入时的多层级问题:
mytool-project/ ├── setup.py └── mytool/ ├── __init__.py └── cli.py
2. 拆分核心功能与CLI逻辑
- 将原
mytool/mytool.py中的process_string核心函数移到mytool/__init__.py,让顶层模块直接暴露该函数:# mytool/__init__.py def process_string(input_str): # 这里写你的字符串处理逻辑 return f"Processed output: {input_str}" - 将原
mytool/mytool.py中的mainCLI入口函数移到mytool/cli.py,单独处理命令行参数:# mytool/cli.py import argparse from mytool import process_string def main(): parser = argparse.ArgumentParser(description="Process input strings") parser.add_argument("string_input", help="String to be processed") args = parser.parse_args() print(process_string(args.string_input)) if __name__ == "__main__": main()
3. 更新setup.py配置
调整setup.py的entry_points和包配置,确保CLI命令和导入功能都正常工作:
# setup.py from setuptools import setup, find_packages setup( name="mytool", version="0.1.0", packages=find_packages(), entry_points={ "console_scripts": [ "mytool = mytool.cli:main", # 绑定CLI命令到cli.py的main函数 ] }, description="A string processing tool usable via CLI or Python import", )
4. 验证功能
安装开发版包
在项目根目录执行:
pip install -e .
测试CLI命令
终端直接运行:
mytool "hello world" # 输出:Processed output: hello world
测试导入使用
在Python脚本或交互式环境中:
import mytool result = mytool.process_string("test import") print(result) # 输出:Processed output: test import
可选优化:复杂场景的结构拆分
如果后续功能扩展,可把核心逻辑放到单独的core.py文件,再在__init__.py中导入,保持顶层模块简洁:
mytool-project/ ├── setup.py └── mytool/ ├── __init__.py ├── core.py └── cli.py
# mytool/core.py def process_string(input_str): return f"Processed output: {input_str}"
# mytool/__init__.py from .core import process_string
这种结构下导入方式不变,同时代码职责划分更清晰。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

