第一个较大的项目需要使用许多包、模块等。我一直在阅读官方 Python 文档和答案,其中讨论了组织包的“正确”方式,但似乎没有达成共识。假设我有这个目录:
application
├── src
│ └── package
│ └── __init__.py
│ └── module.py
│ └── module2.py
├── scripts
│ └── some_script.ipynb
└── more_scripts
└── some_script.ipynb
我的目标是将 src/package 内的模块中的函数导入到所有这些脚本中。我看过很多关于设置 PYTHONPATH 或 syspath 或使用 importlib 或使用相对导入的讨论 - 所有这些策略似乎都被某些用户组所反对。
我的问题是: 什么是最佳实践将这些模块显式导入到所有脚本中? 如果相关的话,我正在尝试将其推送到 Github 上,以供非 CS 人员的受众使用。理想情况下,他们不必设置 PATHS 之类的东西。
提前感谢您的帮助。
我已经尝试过设置 PYTHONPATH,但我认识到这可能对面向非 CS 的存储库最终用户提出了要求.
我尝试过设置 syspath,但 Slackoverflow 似乎不喜欢这个。
Slackoverflow 似乎不喜欢相对导入,但显式导入不起作用,因为脚本不是包。
是对的,没有一种“正确”的方法来组织 Python 包,而且许多经常被提到的解决方案(比如修改
PYTHONPATH
或使用复杂的相对导入)对于不熟悉 Python 的用户来说可能很麻烦。
为了实现的目标,即让非 CS 用户能够轻松运行的脚本,而无需处理任何路径设置,我建议采用以下方法,该方法结合了最佳实践和用户友好性:
-
使用 setup.py 安装包:
-
在的
application
文件夹中创建一个setup.py
文件。这将允许将src/package
作为本地包安装在用户的环境中,以便的脚本可以像导入任何其他第三方库一样导入它。 -
的
setup.py
文件应如下所示:```python from setuptools import setup, find_packages
setup( name='mypackage', # 选择一个描述性名称 version='0.1.0', # 更新版本号 packages=find_packages('src'), package_dir={'': 'src'}, ) ```
-
在脚本中使用绝对导入:
-
安装包后,可以在脚本中使用绝对导入来导入模块:
```python from mypackage import module, module2
# 现在可以使用模块中的函数: module.some_function() module2.another_function() ```
-
提供清晰的说明:
-
在的 README 文件中,提供分步说明,说明用户如何运行的脚本:
-
安装依赖项:
让他们运行
pip install -e .
(在application
文件夹中),这将使用setup.py
安装的包,以及在requirements.txt
中列出的任何其他依赖项(如果适用)。 -
运行脚本:
让他们运行
python scripts/some_script.ipynb
或python more_scripts/some_script.ipynb
。
-
安装依赖项:
让他们运行
这种方法有以下优点:
- 用户友好: 用户只需要运行一个命令来安装所有必要的包,然后就可以运行脚本,而无需担心路径或复杂导入。
-
最佳实践:
使用
setup.py
是打包和分发 Python 代码的标准方法。它使的项目更易于维护和共享。 - 避免相对导入问题: 使用绝对导入可以防止在项目结构发生变化时出现潜在问题。
通过遵循这些步骤,可以创建一个对非技术用户来说易于使用和理解的 Python 项目。
标签:python,python-packaging From: 78790831