如何将另一个 python 项目作为子模型添加到我的项目中?

How to add another python project to my project as a sub-model?

我将 python 项目 B 复制到我的项目 A 作为模型。但是B的include路径是基于B的,那怎么才能从A调用B的函数呢,比如

.
└── mypackage A
    ├── subpackage_1
    │   ├── test11.py
    │   └── test12.py
    ├── subpackage_2
    │   ├── test21.py
    │   └── test22.py
    └── subpackage B
        ├── test31.py
        └── test32.py

test31.py 可能包括 test32.py

import test32

但是从A的角度来看,我应该把它包括在内

import B.test32

事实上,B比这个例子更复杂。我该如何重构它?

只需将名为 __init__.py 的空 python 文件添加到您的 B 项目,即可使 Python 将此项目视为普通 python 模块。

首先在 B 中使用 __init__.py 制作模块 然后试试这个:

from B.test32 import 'function Name'

然后调用它。

正如所说,你应该开始放置__init__.py个文件,但它比比复杂一点。 您必须将那些 __init__.py 文件放在每个目录中。所以它看起来像这样。

.
└── mypackage A
    ├── __init__.py # here under A
    ├── subpackage_1
    |   ├── __init__.py
    │   ├── test11.py
    │   └── test12.py
    ├── subpackage_2
    |   ├── __init__.py # under package 2
    │   ├── test21.py
    │   └── test22.py
    └── subpackage B 
        ├── __init__.py # under package B
        ├── test31.py
        └── test32.py

在每个__init__.py个文件中,您需要导入同一目录下的所有文件。因此,例如在 subpackage B 中,您需要这样做。

#/subpackage B/__init__.py
from . import test31
from . import test32

mypackage A 中没有文件,只有目录,您也可以做同样的事情(from . import subpackage_2 等)。

如果我假设 mypackage A 是“main”包(正如您的 diargam 所见),那么它 不是 一个子模块,到 运行 任何你需要执行以下操作的文件。

cdmypackage A目录,然后

# Suppose you want to execute /subpackage_1/test11
python -m mypackage_A.subpackage_1.test11 # WARNING mypackage A should have no whitespace

您可能会收到 RuntimeWarning 关于您的 sys.modules 被修改的消息,但我可以向您保证,根据经验,您可以安全地忽略它。这就是 python pip 模块的通常完成方式,以确保轻松推送到生产环境。

编辑 :另请注意,在您的所有文件中,您应该切换为相对导入的包导入,因此您必须使用点语法。

from . import test32 # this will import .test32

如果您要从 test31 改为 import test32,interpeter 将尝试搜索名为 test32 的全局包,而不是在同一目录中查找。