从其他文件夹python导入模块(错误)

时间:2018-12-19 03:49:29

标签: python python-import importerror

我是Python的新手。我正在使用以下目录结构,并尝试将模块OrgRepo导入Func1。我正在使用virtualenv和vs代码作为我的IDE。

src/ ├── Functions │   ├── Func1 │   └── Func2 └── Shared ├── __init__.py ├── Repositories │ ├── __init__.py │   ├── OrgRepo └── Utilities ├── __init__.py └── DictUtil 我也尝试了没有` init .py'

的情况

这是我的路径:

['/Users/username/Documents/Projects/myproject/name/src/Functions/Func1', '/Users/username/anaconda3/envs/my_virtual_env/lib/python37.zip', '/Users/username/anaconda3/envs/my_virtual_env/lib/python3.7', '/Users/username/anaconda3/envs/my_virtual_env/lib/python3.7/lib-dynload', '/Users/username/.local/lib/python3.7/site-packages', '/Users/username/anaconda3/envs/my_virtual_env/lib/python3.7/site-packages']

为了将OrgRepo导入Func1,我尝试了以下方法:

1:from .Shared.Repositories import OrgRepo

ModuleNotFoundError: No module named '__main__.Shared'; '__main__' is not a package

2:from ..Shared.Repositories import OrgRepo '

ValueError: attempted relative import beyond top-level package

3:from src.Shared.Repositories import OrgRepo

ModuleNotFoundError: No module named 'src'

4:`从Shared.Repositories导入OrgRepo1

'ModuleNotFoundError: No module named 'Shared'

5:我正在使用VS Code,并且在尝试保存文件时:

它会自动更改为: import OrgRepo import DictionaryUtilities import datetime import json import sys sys.path.insert(0, 'src/Repositories/')

6: import sys sys.path.insert( 0, '/Users/username/Documents/Projects/project/m/src/Repositories') import OrgRepo

还有:

sys.path.insert(0, 'Repositories') sys.path.insert(0, .'Repositories') sys.path.insert(0, ..'Repositories')

在运行或保存时,vs代码会将其更改为: import OrgRepo import sys sys.path.insert( 0, '/Users/username/Documents/Projects/project/m/src/Repositories') 并收到此错误:

ModuleNotFoundError: No module named 'OrgRepo'

我可以通过PIP安装并导入它,但这不符合我们的需求。

我已阅读以下帖子: Importing files from different folder

Python import modules, folder structures

How to Import Multiple Python Modules from Other Directories

How to properly import python modules from an adjacent folder?

我也尝试阅读/理解其他一些文章。 。 。我什至试图几次敲打助焊剂电容器都无济于事。 。

编辑:我正在使用此代码作为AWS Lambda函数上传。尽管sys.path解决方案在本地工作,但它不适合我的工作流程。这需要我在上载时更改要导入的sys.path,并导致Intellisense问题。我希望能够直接导入模块。例如import OrgRepo,因此Intellisense不会引发错误,我可以压缩并将程序包上传到AWS。当我能够导入<module_name>时,我就可以将程序包上传到AWS了。

我在Anaconda中激活我的环境,然后导出以下PYTHONPATH环境变量:

export PYTHONPATH=src/shared/repositories:src/shared/utilities

我也尝试过export PYTHONPATH=$PATH:src/shared/repositories:src/shared/utilities

这工作了一段时间,现在我有了IntelliSense PYTHON[unresolved-import]。尝试从/src上方的目录运行脚本时,似乎没有收到此错误。

如果有人可以向我展示如何使用标准import <module>导入模块并使其始终如一地工作,我将非常感激。

2 个答案:

答案 0 :(得分:0)

基本上说不能导入目录,但是可以导入目录中的文件。

假设您在OrgRepo中有 Org.py 文件,您可以执行以下操作:

from src.Shared.Repositories.OrgRepo import Org

或者如果您要从中调用特定方法,请说do_it

from src.Shared.Repositories.OrgRepo.Org import do_it

Read more

答案 1 :(得分:0)

我认为您要尝试执行的操作类似于以下内容。我已经清理了一些目录名称(通常目录是小写的,带有下划线,而类名是大写的),在Python文件中添加了.py扩展名,并尝试创建一个简约的环境来复制您的方案。希望这会有所帮助。

设置环境

$ mkdir src; mkdir src/functions; touch src/functions/func1.py; mkdir src/shared; mkdir src/shared/repositories; touch src/shared/repositories/org_repo.py

$ tree
.
└── src
    ├── functions
    │   └── func1.py
    └── shared
        └── repositories
            └── org_repo.py

# src/shared/repositories/org_repo.py
def a_cool_func():
    print(f'hello from {__file__}')

# src/functions/func1.py
import pathlib
import sys

file_path = pathlib.Path(__file__)
path = file_path.resolve().parents[2]
sys.path.append(str(path))

from src.shared.repositories.org_repo import a_cool_func

print(f'hello from {__file__}')

a_cool_func()

运行

# note that there is no significance to /Users/username/tmp/tmp/
# this is just the directory where the test environment was setup
$ python src/functions/func1.py
hello from src/functions/func1.py
hello from /Users/username/tmp/tmp/src/shared/repositories/org_repo.py