从 Python 中的相邻文件夹导入模块
Importing modules from adjacent folders in Python
我想问问有没有办法从项目中与另一个文件夹相邻的文件夹导入modules/functions。
例如假设我有两个文件:
project/src/training.py
project/lib/functions.py
现在这两个文件夹中都有 __init__.py
文件。如果我想将functions.py
导入training.py
,它似乎没有检测到。我正在尝试使用 from lib.functions import *
。我知道这在文件夹结构的上层起作用,我可以从脚本中调用这两个文件,但是有没有办法在 above/sideways 中调用文件文件夹?
是的,从工作目录开始写整个路径就这么简单:
from project.src.training import *
或者
from project.lib.functions import *
我同意上面所说的博学。如果您还想知道如何在导入这些特定脚本或函数后 运行,请使用:your_function_name(参数),然后 运行 从同一目录导入的脚本等,使用:exec('script_name.py).但是,我建议使用函数而不是使用 exec 命令,因为它可能有点难以正确使用。
从根本上说,执行此操作的最佳方法取决于两个模块的确切关联方式。有两种可能:
- 这些模块是一个内聚单元的一部分,旨在作为一个整体使用,而不是作为单独的部分使用。 (这是最常见的情况,如果您不确定,应该默认。)
functions.py
模块是 training.py
的依赖项,但旨在单独使用。
凝聚单位
如果模块是一个内聚单元,这不是 Python 中构建项目的标准方式。
如果您在同一个项目中需要多个模块,构建文件夹的标准方法是将所有模块包含在一个 package 中,如下所示:
project/
trainingproject/
__init__.py
training.py
functions.py
other/
...
project/
...
folders/
...
__init__.py
文件导致 Python 将 trainproject/
目录识别为称为包的单个单元。使用包可以使用 相对导入 :
training.py
from . import functions
# The rest of training.py code
假设您的当前目录是 project
,然后您可以将 training.py
作为模块调用:
python -m trainingproject.training
独立单位
如果您的模块实际上是单独的包,那么在开发过程中最简单的惯用解决方案是修改PYTHONPATH
环境变量:
sh-衍生语法:
# All the extra PYTHONPATH references on the right are to append if it already has values
# Using $PWD ensures that the path in the environment variable is absolute.
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 是首选。)
在您的模块中,您只需做一个普通的 import
语句:
training.py
import functions
# Rest of training.py code
当您部署您的代码到生产环境时,如果您复制所有文件并设置正确的路径,这样做也将起作用,但您可能需要考虑将 functions.py
在一个轮子里,然后用 pip 安装它。这将消除通过将 functions.py
安装到站点包来设置 PYTHONPATH
的需要,这将使 import
语句开箱即用。这也将使分发 functions.py
与独立于 training.py
的 other 脚本一起使用变得更容易。我不打算在这里介绍如何创建一个轮子,因为这超出了这个问题的范围,但这里是 an introduction.
我想问问有没有办法从项目中与另一个文件夹相邻的文件夹导入modules/functions。
例如假设我有两个文件:
project/src/training.py
project/lib/functions.py
现在这两个文件夹中都有 __init__.py
文件。如果我想将functions.py
导入training.py
,它似乎没有检测到。我正在尝试使用 from lib.functions import *
。我知道这在文件夹结构的上层起作用,我可以从脚本中调用这两个文件,但是有没有办法在 above/sideways 中调用文件文件夹?
是的,从工作目录开始写整个路径就这么简单:
from project.src.training import *
或者
from project.lib.functions import *
我同意上面所说的博学。如果您还想知道如何在导入这些特定脚本或函数后 运行,请使用:your_function_name(参数),然后 运行 从同一目录导入的脚本等,使用:exec('script_name.py).但是,我建议使用函数而不是使用 exec 命令,因为它可能有点难以正确使用。
从根本上说,执行此操作的最佳方法取决于两个模块的确切关联方式。有两种可能:
- 这些模块是一个内聚单元的一部分,旨在作为一个整体使用,而不是作为单独的部分使用。 (这是最常见的情况,如果您不确定,应该默认。)
functions.py
模块是training.py
的依赖项,但旨在单独使用。
凝聚单位
如果模块是一个内聚单元,这不是 Python 中构建项目的标准方式。
如果您在同一个项目中需要多个模块,构建文件夹的标准方法是将所有模块包含在一个 package 中,如下所示:
project/
trainingproject/
__init__.py
training.py
functions.py
other/
...
project/
...
folders/
...
__init__.py
文件导致 Python 将 trainproject/
目录识别为称为包的单个单元。使用包可以使用 相对导入 :
training.py
from . import functions
# The rest of training.py code
假设您的当前目录是 project
,然后您可以将 training.py
作为模块调用:
python -m trainingproject.training
独立单位
如果您的模块实际上是单独的包,那么在开发过程中最简单的惯用解决方案是修改PYTHONPATH
环境变量:
sh-衍生语法:
# All the extra PYTHONPATH references on the right are to append if it already has values
# Using $PWD ensures that the path in the environment variable is absolute.
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 是首选。)
在您的模块中,您只需做一个普通的 import
语句:
training.py
import functions
# Rest of training.py code
当您部署您的代码到生产环境时,如果您复制所有文件并设置正确的路径,这样做也将起作用,但您可能需要考虑将 functions.py
在一个轮子里,然后用 pip 安装它。这将消除通过将 functions.py
安装到站点包来设置 PYTHONPATH
的需要,这将使 import
语句开箱即用。这也将使分发 functions.py
与独立于 training.py
的 other 脚本一起使用变得更容易。我不打算在这里介绍如何创建一个轮子,因为这超出了这个问题的范围,但这里是 an introduction.