如何将另一个 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 所见),那么它 不是 一个子模块,到 运行 任何你需要执行以下操作的文件。
先cd
到mypackage 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
的全局包,而不是在同一目录中查找。
我将 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 所见),那么它 不是 一个子模块,到 运行 任何你需要执行以下操作的文件。
先cd
到mypackage 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
的全局包,而不是在同一目录中查找。