基本上,最佳方法取决于这两个模块的关系。有两种情况:
- 这两个模块是一个整体的一部分,旨在作为一个整体使用,而不是作为独立的部分。 (这是最常见的情况,如果您不确定,应该选择这种方式。)
functions.py
模块是training.py
的依赖模块,但是可以单独使用。
整体一体
如果这些模块是一个整体的一部分,那么这不是Python项目中结构化的标准方式。
如果您需要在同一项目中使用多个模块,则标准的文件夹结构方式是将所有模块放在单个包中,如下所示:
project/
trainingproject/
__init__.py
training.py
functions.py
other/
...
project/
...
folders/
...
__init__.py
文件会让 Python 将 trainproject/
目录识别为一个叫做包的单元。使用包可以启用相对导入功能:
training.py
from . import functions
假设您当前的目录是
project
,则可以将
training.py
作为模块调用:
python -m trainingproject.training
分离单元
如果您的模块实际上是单独的包,那么在开发过程中最简单的惯用解决方案是修改PYTHONPATH
环境变量:
使用sh衍生语法:
PYTHONPATH=$PYTHONPATH${PYTHONPATH:+:}$PWD/lib/
python ./src/training.py
PowerShell 语法:
$env:PYTHONPATH = $(if($env:PYTHONPATH) {$env:PYTHONPATH + ';'}) + (Resolve-Path ./lib)
python ./src/training.py
(这在命令提示符中也可以实现,但我将其省略,因为PowerShell更受欢迎。)
在您的模块中,您只需执行正常的导入语句:
training.py
import functions
这样做将会在您将代码部署到生产环境时起作用,如果您复制所有文件并设置正确的路径,但是您可能需要考虑把
functions.py
打包成一个wheel文件,然后使用pip进行安装。这将消除通过将
functions.py
安装到site-packages来设置
PYTHONPATH
的需要,这将使
import
语句可以直接使用。这也将使得更容易分发
functions.py
以便与其他脚本独立使用,而不必依赖于
training.py
。我不会在这里介绍如何创建wheel文件,因为它超出了这个问题的范围,但这里有
一个简介。
__init__.py
,而不是__init.py__
。你可以使用import functions
从另一个模块导入一个模块。请创建一个最小化、完整化和可验证的示例。 - zvoneproject
中有一个__init__.py
文件,则可以使用相对导入:from ..lib import functions
,或者from ..lib.functions import *
或其他类似方式。 - Green Cloak Guy