我在Django框架中有chatbot Web应用程序。到目前为止一切正常,但是现在,我想使用ajax运行chatbot python脚本并从Javascript文件中调用它的视图。我有一个使用REST的API和python脚本的视图以及调用该视图的ajax。
view.py:
from chat.chatbot1 import main_chatbot
def run_python_script(request):
os.system('python3 main_chatbot.py')
return HttpResponse("OK")
index.js:
function run_chatbot_script(){
$.ajax({
type: 'GET',
url: 'http://127.0.0.1:8000/chatbot/run_python_script/',});
并且python脚本文件夹位于chatbot django项目内的聊天应用程序中。
问题是该视图无法找到该文件,并显示此错误:
python3: can't open file 'main_chatbot.py': [Errno 2] No such file or directory
答案 0 :(得分:2)
如果在同一文件夹中,则应导入它:
示例if是与view.py
相同的文件夹import .run_python_script
然后只需调用你想要的功能...... 你也可以把完整的路径放在os.system中,但看起来不行......
答案 1 :(得分:0)
你的Django应用程序可能会将工作目录作为manage.py文件的位置,因此它会将python脚本放在同一目录中。
使用脚本的完整路径,或相对于mange.py所在目录的路径。
所以可能是这样的:
there
或
os.system('python3 chat/main_chatbot.py')
(建议导入脚本的答案可能是更好的方法,除非特别需要将其作为单独的进程运行)。
答案 2 :(得分:0)
你应该给出main_chatbot.py
的完整路径。
最好的方法是使用pkg_resources.resource_filename,如下所示:
import pkg_resources
script_path = pkg_resources.resource_filename('chat', 'main_chatbot.py")
其中 chat 是包含您脚本的包的名称。
要运行脚本,最好使用与Project的可执行文件相同的Python可执行文件(您的virtualenv)。
这样做,您可以使用sys.executable来获取virtualenv使用的Python路径:
import sys
python_path = sys.executable
最佳做法是将os.system
替换为subprocess.check_call,如下所示:
import subprocess
subprocess.check_call([python_path, script_path]