我有这样的文件夹结构:

application
├── app
│   └── folder
│       └── file.py
└── app2
    └── some_folder
        └── some_file.py

如何从file.py或some_file.py中导入函数?我尝试了:

from application.app.folder.file import func_name

但它不起作用。


当前回答

创建包的最佳实践是从最高级别目录中的main_module.py等模块运行和访问其他模块。

此结构说明您可以使用顶级目录文件main_module.py来使用和访问子包、父包或同级包和模块。

创建并运行这些文件和文件夹以进行测试:

 package/
    |
    |----- __init__.py (Empty file)
    |------- main_module.py (Contains: import subpackage_1.module_1)        
    |------- module_0.py (Contains: print('module_0 at parent directory, is imported'))
    |           
    |
    |------- subpackage_1/
    |           |
    |           |----- __init__.py (Empty file)
    |           |----- module_1.py (Contains: print('importing other modules from module_1...')
    |           |                             import module_0
    |           |                             import subpackage_2.module_2
    |           |                             import subpackage_1.sub_subpackage_3.module_3)
    |           |----- photo.png
    |           |
    |           |
    |           |----- sub_subpackage_3/
    |                        |
    |                        |----- __init__.py (Empty file)
    |                        |----- module_3.py (Contains: print('module_3 at sub directory, is imported')) 
    |
    |------- subpackage_2/
    |           |
    |           |----- __init__.py (Empty file)
    |           |----- module_2.py (Contains: print('module_2 at same level directory, is imported'))

现在运行main_module.py

输出为

>>>'importing other modules from module_1...'
   'module_0 at parent directory, is imported'
   'module_2 at same level directory, is imported'
   'module_3 at sub directory, is imported'

打开图片和文件注意事项:

在包结构中,如果您想访问照片,请使用最高级别目录中的绝对目录。

假设您正在运行main_module.py,并且希望在module_1.py中打开photo.png。

module_1.py必须包含的内容是:

对的:

image_path = 'subpackage_1/photo.png'
cv2.imread(image_path)

错误:

image_path = 'photo.png'
cv2.imread(image_path)

尽管module1.py和photo.png位于同一目录。

其他回答

当模块位于平行位置时,如问题所示:

application/app2/some_folder/some_file.py
application/app2/another_folder/another_file.py

这种速记使一个模块对另一个模块可见:

import sys
sys.path.append('../')

如果您只想运行脚本而不是实际导入脚本,则exec命令将执行此操作

exec(open('/full/or/relative/path').read())

如果有多个文件夹和子文件夹,则始终可以从主目录导入任何类或模块。

例如:项目的树形结构

Project 
├── main.py
├── .gitignore
|
├── src
     ├────model
     |    └── user_model.py
     |────controller
          └── user_controller.py

现在,如果您想从main.py文件中的user_model.py导入“UserModel”类,可以使用:

from src.model.user_model.py import UserModel

此外,您可以使用同一行在user_controller.py文件中导入同一类:

from src.model.user_model.py import UserModel

总之,您可以提供主项目目录的引用,以导入project目录中任何python文件中的类和文件。

这个问题可能是因为Pycharm

我在使用Pycharm时遇到了同样的问题。我有这个项目结构

skylake\
   backend\
      apps\
          example.py
      configuration\
          settings.py
   frontend\
      ...some_stuff

和example.py中配置导入设置的代码引发导入错误

问题是,当我打开Pycharm时,它认为skylake是根路径,并运行了这段代码

sys.path.extend(['D:\\projects\\skylake', 'D:/projects/skylake'])

为了解决这个问题,我只将后端目录标记为源根目录

它解决了我的问题

而不是仅仅做一个导入。。。,执行以下操作:

从<MySubFolder>导入<MyFile>

MyFile位于MySubFolder中。