如何从另一个目录的子包中的python子目录中导入文件?

时间:2018-10-25 10:24:14

标签: python python-3.x python-import

我的家庭项目文件夹中具有以下目录结构。

 |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

2 个答案:

答案 0 :(得分:1)

因此,您已经引用了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

最后,仅当使用该点的文件位于软件包中时,向上移动点符号才有效,因此如果在顶层在此软件包之外的范围中启动程序然后使用{ {1}}

但是,如果直接运行from __ALL-IN-ONE.models.grpc import allinone_server,则它将无法导入上面的任何内容,因为它不会作为软件包的一部分被导入。试试看,让我知道是否需要更好的解释。

祝你好运!

答案 1 :(得分:0)

您不能直接从另一个文件夹导入功能,为此您必须使用此功能:

import sys
sys.path.insert(0, "../../demo/")

下一步是将__main__重命名为main

这是为我工作的确切示例:

树:

.
├── demo
│   ├── __init__.py
│   ├── main.py
│   
└── models
    └── grpc
        └── allinone_server.py

main.py:

def images_demo():
    print("hello there")

呼叫文件allinone_server.py

import sys
sys.path.insert(0, "../../demo/")

import main

main.images_demo()