如何让适用于PHP调用的Python代码在Django中正常运行?
兼容Django与PHP环境的解决方案
方法1:修改Django配置,添加函数目录到sys.path(推荐,无需修改原有Python代码)
- 确认你的Python函数文件所在的绝对路径,比如
/var/www/python_functions(即所有.py文件的存放目录)。 - 打开Django项目的
settings.py文件,在开头添加以下代码:
import sys from pathlib import Path # 替换为你的Python函数文件所在绝对路径 PYTHON_FUNCTIONS_DIR = Path("/var/www/python_functions") # 将该目录加入Python模块搜索路径 if str(PYTHON_FUNCTIONS_DIR) not in sys.path: sys.path.insert(0, str(PYTHON_FUNCTIONS_DIR))
- 现在可以在Django视图中直接使用原有导入语句调用函数,示例:
from django.http import JsonResponse from your_top_level_file import main_function def django_view(request): result = main_function(request.GET.get("args")) return JsonResponse(result)
- PHP环境下的调用无需任何修改,依然可以用
python3 'file' 'args'正常运行。
方法2:修改入口脚本,适配模块搜索路径(适合不想改动Django配置的场景)
给每个被PHP直接调用的顶层Python脚本添加以下代码(放在文件最开头):
import sys from pathlib import Path # 获取当前脚本所在目录(即所有函数文件的目录) current_dir = Path(__file__).resolve().parent # 确保该目录在模块搜索路径最前端,优先查找本地模块 if str(current_dir) not in sys.path: sys.path.insert(0, str(current_dir))
PHP调用时脚本会自动把自身所在目录加入sys.path,保证导入正常;Django环境下,只需在视图中用绝对路径导入模块(或参照方法1把函数目录加入Django的sys.path),原有导入语句无需修改。
方法3:动态切换导入语法(适合必须保留相对导入的场景)
如果需要使用相对导入,可在每个涉及导入的模块中添加判断,区分主脚本运行(PHP)和被导入(Django)的场景:
# 在每个需要导入其他模块的文件中添加 if __name__ == "__main__": # PHP调用时作为主脚本,使用无点的绝对导入 from file_with_lower_level_functions import gimme_this_table else: # Django中被导入,使用相对导入 from .file_with_lower_level_functions import gimme_this_table
注意:该方法需要修改所有涉及导入的模块(包括深层导入的4-5层文件),工作量较大,仅推荐在前两种方法不可用时采用。
内容的提问来源于stack exchange,提问作者troppapolvere
相关产品推荐
相关产品推荐

