Django在线运行 Python 脚本,如何将脚本运行环境切换至虚拟环境?

自己用django搭了一个网站,用subprocess调用了相同目录下的一个python文件,
调用的是一个GAN模型,views.py规定如下

def run_script(request):
import sys
import os
sys.path.append(os.path.dirname(sys.path[0]))
result = subprocess.run(['python', 'gan/gan.py'], capture_output=True, text=True)
return JsonResponse({'output': result.stdout, 'error': result.stderr})

服务器正常启动。
django编写的整个服务器调用的是pycharm创建的虚拟环境,但是调用单个脚本时调用默认运行环境,求教如何解决

试过向views.py和settings.py添加代码,并且已经注释掉了

import sys
import os
sys.path.append(os.path.dirname(sys.path[0]))

阅读 541
avatarAI BotBETA

这个问题看起来是环境路径或者Python环境问题。当通过Django的subprocess模块调用gan.py脚本时,这个子进程可能没有继承Django进程的环境变量,特别是那些与Python解释器和其库(比如numpy)相关的变量。

这里有几种可能的解决方案:

  1. 确保子进程使用正确的Python解释器
    确认subprocess.run使用的是与Django项目相同的Python解释器。有时系统可能安装了多个Python版本,而subprocess可能默认使用了不同的版本。你可以指定Python解释器的完整路径,比如['/usr/bin/python3', 'gan/gan.py']
  2. 虚拟环境
    如果你的Django项目是在一个虚拟环境中运行的,确保gan.py也在相同的虚拟环境中运行。你可以在调用subprocess.run之前激活虚拟环境,或者通过指定虚拟环境中Python解释器的路径来运行脚本。
  3. 安装所有依赖
    如果gan.py依赖于某些库(如numpy),你需要确保这些库在Django项目的环境中也已经安装。你可以通过运行pip install -r requirements.txt来安装所有依赖,其中requirements.txt包含了所有必要的Python包及其版本。
  4. 使用Django的shell或管理命令
    如果可能的话,考虑将GAN模型的逻辑整合到Django的框架中,而不是通过subprocess调用一个单独的脚本。你可以创建Django的自定义命令或直接在视图中调用模型的逻辑。
  5. 调试子进程
    gan.py的顶部添加一些打印语句,输出Python解释器的路径和sys.path的内容。这样你可以比较Django进程和子进程的环境差异。
  6. 检查权限问题
    确保Django运行的用户有权访问gan.py脚本以及任何它依赖的文件或目录。

如果上述方法都不奏效,你还可以尝试使用绝对路径来引用gan.py,并在Django项目的虚拟环境中重新安装所有依赖,确保它们都是可用的。

最后,务必注意,直接在Web视图中调用长时间运行的脚本(如GAN模型)可能不是最佳实践,因为它可能会阻塞Web服务器并影响性能。考虑使用后台任务队列(如Celery)或异步处理来处理这类任务。

2 个回答

把run参数中第一个python换成你想要的环境中解释器的绝对路径就可以,想要用当前运行环境的可以用sys.executable获取当前解释器路径

新手上路,请多包涵

有个快捷的方法:使用绝对路径直接指定python解释器。如下第二种方式就是指定解释器方式运行。

news_yu@SZ-YUXINWEN-L1:~$ python --version
Python 3.10.4
news_yu@SZ-YUXINWEN-L1:~$ /home/news_yu/.pyenv/versions/3.6.5/envs/fvr_pdms/bin/python --version
Python 3.6.5

你需要先找到创建的虚拟环境目录。类似:‘/XXX/venv/{虚拟环境名}/bin/python’。
然后将这个替换以下代码中“python”。
result = subprocess.run(['python', 'gan/gan.py'], capture_output=True, text=True)

这种写死的方式不太灵活,推荐使用celery任务队列去实现。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏