我有这样的文件夹结构:
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
但它不起作用。
当前回答
name-file.py中的第一个导入系统
import sys
第二次在name-file.py中追加文件夹路径
sys.path.insert(0, '/the/folder/path/name-package/')
第三,在子目录中创建一个名为__init__.py的空白文件(这告诉Python它是一个包)
name-file.py名称包__初始化__.py名称模块.py
第四步导入name-file.py文件夹中的模块
from name-package import name-module
其他回答
我认为一种特别的方法是使用环境变量PYTHONPATH,如文档中所述:Python2,Python3
# Linux & OSX
export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH
# Windows
set PYTHONPATH=C:\path\to\dirWithScripts\;%PYTHONPATH%
您可以使用importlib导入模块,其中您希望使用如下字符串从文件夹中导入模块:
import importlib
scriptName = 'Snake'
script = importlib.import_module('Scripts\\.%s' % scriptName)
这个示例有一个main.py,它是上面的代码,然后是一个名为Scripts的文件夹,然后您可以通过更改scriptName变量从这个文件夹中调用所需的任何内容。然后可以使用脚本引用此模块。例如,如果我在Snake模块中有一个名为Hello()的函数,您可以通过这样做来运行该函数:
script.Hello()
我已经在Python 3.6中测试过了
如果有多个文件夹和子文件夹,则始终可以从主目录导入任何类或模块。
例如:项目的树形结构
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文件中的类和文件。
当模块位于平行位置时,如问题所示:
application/app2/some_folder/some_file.py
application/app2/another_folder/another_file.py
这种速记使一个模块对另一个模块可见:
import sys
sys.path.append('../')
下面的代码以Python版本安全的方式导入由路径给定的Python脚本,无论它位于何处:
def import_module_by_path(path):
name = os.path.splitext(os.path.basename(path))[0]
if sys.version_info[0] == 2:
# Python 2
import imp
return imp.load_source(name, path)
elif sys.version_info[:2] <= (3, 4):
# Python 3, version <= 3.4
from importlib.machinery import SourceFileLoader
return SourceFileLoader(name, path).load_module()
else:
# Python 3, after 3.4
import importlib.util
spec = importlib.util.spec_from_file_location(name, path)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
我在psutils.test.__init__.py的第1042行psutils代码库中发现了这一点(最新提交时间为2020年10月9日)。
用法示例:
script = "/home/username/Documents/some_script.py"
some_module = import_module_by_path(script)
print(some_module.foo())
重要警告:该模块将被视为顶级模块;从父包中的任何相对导入都将失败。