我是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>
导入模块并使其始终如一地工作,我将非常感激。
答案 0 :(得分:0)
基本上说不能导入目录,但是可以导入目录中的文件。
假设您在OrgRepo中有 Org.py 文件,您可以执行以下操作:
from src.Shared.Repositories.OrgRepo import Org
或者如果您要从中调用特定方法,请说do_it
:
from src.Shared.Repositories.OrgRepo.Org import do_it
答案 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