尝试在Apache上启动Django:致命的Python错误:初始化文件系统编码:无法获取文件系统编码的Python编解码器

t2a7ltrp  于 2023-03-19  发布在  Apache
关注(0)|答案(1)|浏览(391)

我的目标是在Apache上运行我的Django项目,它是在虚拟环境中从“virtualenv”创建的。我遵循了这个tutorial,它运行得很好,直到我想将Apache作为Windows服务启动,结果是:

[Tue Mar 14 14:43:28.277072 2023] [mpm_winnt:notice] [pid 19800:tid 412] AH00455: Apache/2.4.56 (Win64) mod_wsgi/4.9.4 Python/3.10 configured -- resuming normal operations
[Tue Mar 14 14:43:28.278069 2023] [mpm_winnt:notice] [pid 19800:tid 412] AH00456: Apache Lounge VS17 Server built: Mar  6 2023 10:53:37
[Tue Mar 14 14:43:28.278069 2023] [core:notice] [pid 19800:tid 412] AH00094: Command line: 'C:\\Apache24\\bin\\httpd.exe -d C:/Apache24'
[Tue Mar 14 14:43:28.283041 2023] [mpm_winnt:notice] [pid 19800:tid 412] AH00418: Parent: Created child process 8896
Python path configuration:
  PYTHONHOME = (not set)
  PYTHONPATH = (not set)
  program name = 'python'
  isolated = 0
  environment = 1
  user site = 1
  import site = 1
  sys._base_executable = 'C:\\Apache24\\bin\\httpd.exe'
  sys.base_prefix = 'C:\\miniconda3'
  sys.base_exec_prefix = 'C:\\miniconda3'
  sys.platlibdir = 'lib'
  sys.executable = 'C:\\Apache24\\bin\\httpd.exe'
  sys.prefix = 'C:\\miniconda3'
  sys.exec_prefix = 'C:\\miniconda3'
  sys.path = [
    'C:\\miniconda3\\python310.zip',
    '.\\DLLs',
    '.\\lib',
    'C:\\Apache24\\bin',
  ]
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'

Current thread 0x000050e4 (most recent call first):
  <no Python frame>
[Tue Mar 14 14:43:28.946306 2023] [mpm_winnt:crit] [pid 19800:tid 412] AH00419: master_main: create child process failed. Exiting.

我的httpd.conf文件看起来像这样:

<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

LoadFile "C:/miniconda3/python310.dll"
LoadModule wsgi_module "C:/Django/venv/lib/site-packages/mod_wsgi/server/mod_wsgi.cp310-win_amd64.pyd"
WSGIPythonHome "C:/Django/venv/Scripts/python.exe"
WSGIPythonPath "C:/Django/Lib/site-packages" 

<VirtualHost *:80>
ServerAlias www.server.com
ServerName server.com
ServerAdmin info@admin.com
SetEnv PYTHONUTF8 1
WSGIScriptAlias / "C:/Django/project/project/wsgi.py"
  <Directory "C:/Django/project/project">
    <Files wsgi.py>
      Require all granted
    </Files>
  </Directory>

Alias /static/ "C:/Django/project/static/"
  <Directory "C:/Django/project/static">
    Require all granted
  </Directory>

ErrorLog "C:/Apache24/logs/apache.error.log"
CustomLog "C:/Apache24/logs/apache.custom.log" common
</VirtualHost>

加载文件我也尝试过将python310.dll复制到.venv/Scripts路径(如教程中所述),但这会引发一个错误,即.dll无法找到。2此外,我尝试设置这部分:

LoadFile "C:/miniconda3/python310.dll"
LoadModule wsgi_module "C:/Django/venv/lib/site-packages/mod_wsgi/server/mod_wsgi.cp310-win_amd64.pyd"
WSGIPythonHome "C:/Django/venv/Scripts/python.exe"
WSGIPythonPath "C:/Django/Lib/site-packages"

作为迷你图标路径,以防这可能导致问题。
最后我也试着让Django本身成为一个Windows服务,但是环境说它已经安装了pypiwin32pywin32,但是无法导入

import win32serviceutil
import win32service
import win32event
import servicemanager

理想情况下,我可以修复Apache的第一个问题。但是,有几篇文章没有帮助,因为他们经常只是建议不要设置PYTHONHOME或PYTHONPATH(在可能的情况下,两者都没有设置),或者问题是基于Linux的。
此外,我怀疑系统前缀中的miniconda 3可能会导致问题,但是miniconda是不同项目所需要的。
有人知道我做错了什么吗?(可以提供进一步的代码,但这已经是一个很长的问题)

dsekswqp

dsekswqp1#

如果任何人遇到类似的问题,下面的工作现在:
我下载了一个新的Python并安装给所有用户,并将其添加(手动)到Systempathvariables中。对于LoadFile python310.dll,路径现在来自这个新的Python,并且WSGIPythonHome转到新Python中的Python.exe。
此外,我想补充的是,我遵循的Tutorial确实建议安装一个新的Python,但是LoadFile建议转到Apache找不到的Project-root/venv/Scripts路径。
此外,当创建venv和安装软件包时,我以管理员身份打开了VS 2022的CMD提示符(安装VS构建工具时会出现)。在此之前,cmd在安装mod_wsgi时会引发错误,但作为管理员,这并不是问题。
我希望这对以后的人有帮助。

相关问题