首页 > 解决方案 > 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

标签: pythonpython-3.xpython-import

解决方案


所以你提到了 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直接运行,那么它将无法导入上面的任何内容,因为它没有作为包的一部分导入。试试看,如果需要更好的解释,请告诉我。

祝你好运!


推荐阅读