python - python - 如何从另一个目录中的子包导入python子目录中的文件?
问题描述
我的主项目文件夹中有以下目录结构。
|ALL-IN-ONE
|demo
|__init__.py
|__main__.py
|models
|grpc
|allinone_server.py
我想从 allinone_server.py 导入一个在main .py 中定义的函数,称为 images_demo。我努力了
from demo.__main__ import images_demo
它不工作。我怎样才能导入它?我要导入的函数位于演示目录内的main .py 内。我正在尝试从 grpc 中的文件 allinone_server.py 导入它。我想我现在已经把我的问题说清楚了。这是该项目的整个树
├── demo
│ ├── __init__.py
│ ├── __main__.py
│ └── __pycache__
│ ├── __init__.cpython-36.pyc
│ └── main.cpython-36.pyc
├── description
├── environment.yml
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ └── update.sample
├── imgs
│ └── 44.jpg
├── info
│ └── exclude
├── __init__.py
├── loggers
│ ├── __init__.py
│ └── __pycache__
│ └── __init__.cpython-36.pyc
├── models
│ ├── adience_large1.h5
│ ├── adience_small1.h5
│ ├── AgeModel.json
│ ├── detection_age_gender_large1.h5
│ ├── detection_age_gender_small1.h5
│ ├── detection_age_gender_smile_large1.h5
│ ├── detection_age_gender_smile_small1.h5
│ ├── detection_age_large1.h5
│ ├── detection_age_small1.h5
│ ├── detection_large1.h5
│ ├── detection_small1.h5
│ ├── grpc
│ │ ├── adele_2016.jpg
│ │ ├── allinone_client.py
│ │ ├── all_in_one_pb2_grpc.py
│ │ ├── all_in_one_pb2.py
│ │ ├── all_in_one.proto
│ │ ├── allinone_server.py
│ │ ├── benedict_cumberbatch_2014.png
│ │ ├── cat.png
│ │ ├── classroom_in_tanzania.jpg
│ │ ├── decoded1.py
│ │ ├── decoded.py
│ │ ├── elon_musk_2015.jpg
│ │ ├── laos.jpg
│ │ ├── model_face.jpg
│ │ ├── __pycache__
│ │ │ ├── all_in_one_pb2.cpython-36.pyc
│ │ │ ├── all_in_one_pb2_grpc.cpython-36.pyc
│ │ │ └── decoded.cpython-36.pyc
│ │ ├── sophia.jpg
│ │ ├── test
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-36.pyc
│ │ │ └── test_images
│ │ │ ├── adele_2016.jpg
│ │ │ ├── benedict_cumberbatch_2014.png
│ │ │ ├── classroom_in_tanzania.jpg
│ │ │ ├── elon_musk_2015.jpg
│ │ │ ├── __init__.py
│ │ │ ├── laos.jpg
│ │ │ ├── model_face.jpg
│ │ │ ├── sophia.jpg
│ │ │ ├── waaah.jpg
│ │ │ ├── woman.jpg
│ │ │ └── zebra_stripes.jpg
│ │ ├── waaah.jpg
│ │ ├── woman.jpg
│ │ └── zebra_stripes.jpg
解决方案
所以你提到了 main.py,但你的目录结构中也有 __main__.py。我假设您的目录实际上包含 main.py 而不是 __main__.py。
要从包中的更高级别导入,请以句点开始导入。要仅导入您将使用的一项功能from .main import images_demo
现在,让我们先说 main.py 和 allinone_server.py 一起在 grpc/ 中,然后我们将它移动到不同的目录,看看导入如何变化。
如果它在 grpc/from .main import images_demo
如果它在模型中/from ..main import images_demo
如果它在 __ALL-IN-ONE/from ...main import images_demo
如果它在 __demo/from ...__demo.main import images_demo
每个额外的时间段都会使您在层次结构中上升一个级别,然后您在目标路径中使用下一个级别的名称,直到您到达您想要的位置。
现在让我们假设您想要导入整个 main.py。如果它在 grpc/from . import main
如果它在模型中/from .. import main
如果它在 __ALL-IN-One/from ... import main
如果它在 __demo/from ...__demo import main
最后,上移一个级别的点符号仅在使用它的文件位于包中时才有效,因此如果在顶层您在此包之外的范围内启动程序然后使用,这将正常工作from __ALL-IN-ONE.models.grpc import allinone_server
但是,如果您allinone_server.py
直接运行,那么它将无法导入上面的任何内容,因为它没有作为包的一部分导入。试试看,如果需要更好的解释,请告诉我。
祝你好运!
推荐阅读
- json - 在响应对象中序列化日期时间对象(Python Rest API)
- docker - 强制 Docker:Jellyfin 使用 Synology 上的现有配置数据
- javascript - TypeError:无法读取 null 的属性“addEventListener”?
- python - Python API 调用 CloudFlare - 多个错误 1069 和 1002
- reactjs - 如何在单页应用程序(SPA)中单独部署模块?
- mysql - 尝试根据条件获取值时出错的MYSQL案例
- android - 海拔没有在cardview上正确显示
- java - 获取excel中的所有列记录,而不是使用apache poi仅获取最后一列记录
- openstack - /etc/keystone/fernet-keys/ 不包含密钥,使用 keystone-manage fernet_setup 创建 Fernet 密钥
- ios - 从收到的授权标头中提取信息 - iOS