我有这样的文件夹结构:
application
├── app
│ └── folder
│ └── file.py
└── app2
└── some_folder
└── some_file.py
如何从file.py或some_file.py中导入函数?我尝试了:
from application.app.folder.file import func_name
但它不起作用。
我有这样的文件夹结构:
application
├── app
│ └── folder
│ └── file.py
└── app2
└── some_folder
└── some_file.py
如何从file.py或some_file.py中导入函数?我尝试了:
from application.app.folder.file import func_name
但它不起作用。
当前回答
你可以使用pip的pipinstall-e。命令您必须在项目目录的根目录中创建一个名为setup.py的文件,该文件包含以下内容:
from setuptools import find_packages, setup
setup(
name='src',
packages=find_packages(),
version='0.1.0',
description='my_project',
author='author',
license='MIT',
)
然后,输入pipinstall-e。而在项目的根目录中。这将使所有目录都能以其名称作为模块进行调用。例如,如果根目录包含子目录module1和module2,每个子目录中都有脚本,则可以使用以下命令从任何子目录访问module1:
将模块1.script1导入为script1
其他回答
创建包的最佳实践是从最高级别目录中的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位于同一目录。
您可以通过按f5刷新Python shell,或转到运行->运行模块。这样,您就不必更改目录来读取文件中的内容。Python将自动更改目录。但是,如果您想使用PythonShell中不同目录中的不同文件,那么可以在sys中更改目录,正如Cameron之前所说的那样。
我也面临着同样的挑战,尤其是在导入多个文件时,这就是我如何克服的。
import os, sys
from os.path import dirname, join, abspath
sys.path.insert(0, abspath(join(dirname(__file__), '..')))
from root_folder import file_name
以防有人仍在寻找解决方案。这对我有用。
Python将包含您启动的脚本的文件夹添加到PYTHONPATH中,因此如果您运行
python application/app2/some_folder/some_file.py
只有文件夹application/app2/some_folder被添加到路径(而不是执行命令的基本目录)。相反,将文件作为模块运行,并在some_folder目录中添加__init__.py。
python -m application.app2.some_folder.some_file
这将把基本目录添加到python路径,然后可以通过非相对导入访问类。
如果有多个文件夹和子文件夹,则始终可以从主目录导入任何类或模块。
例如:项目的树形结构
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文件中的类和文件。