在发布这篇文章的时候,我正在使用最新的Laragon(Full 6.0)用于本地服务器和Laravel 10。我有一个项目,我需要运行一个Python脚本并在浏览器中显示结果。这里是我的控制器中的示例代码。
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
public function index()
{
$pythonCode = public_path('python/linear-regression-sample.py');
$process = new Process(['python', $pythonCode]);
$process->run();
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
}
$output = $process->getOutput();
// $scriptPath = public_path('python/linear-regression-sample.py');
// $output = shell_exec('python ' . $scriptPath);
// Pass the output to the view
return view('project.predictions.predictions', ['output' => $output]);
}
我使用的是Laragon Python内置的解释器(3.10.6)。有两种方法可以运行Python脚本,一种是使用Symfony,另一种是使用shell_exec。这两种方法在简单的Python脚本上运行良好,例如print(“Hello,World!”)。然而,当我导入matplotlib(3.8.0)时,只有shell_exec可以工作,而Symfony方法给了我一个运行时错误。下面是错误。
Symfony \ Component \ Process \ Exception \ ProcessFailedException
PHP 8.1.10, 10.24.0
The command "python "C:\laragon\www\DLTP-1\public\python/linear-regression-sample.py"" failed. Exit Code: 1(General error) Working directory: C:\laragon\www\DLTP-1\public Output:
================ Error Output: ================
Traceback (most recent call last):
File "C:\laragon\www\DLTP-1\public\python\linear-regression-sample.py", line 6, in <module>
import matplotlib.pyplot as plt
File "C:\laragon\bin\python\python-3.10\lib\site-packages\matplotlib\__init__.py", line 990, in <module>
dict.update(rcParams, _rc_params_in_file(matplotlib_fname()))
File "C:\laragon\bin\python\python-3.10\lib\site-packages\matplotlib\__init__.py", line 638, in matplotlib_fname
for fname in gen_candidates():
File "C:\laragon\bin\python\python-3.10\lib\site-packages\matplotlib\__init__.py", line 635, in gen_candidates
yield os.path.join(get_configdir(), 'matplotlibrc')
File "C:\laragon\bin\python\python-3.10\lib\site-packages\matplotlib\__init__.py", line 348, in wrapper
ret = func(**kwargs)
File "C:\laragon\bin\python\python-3.10\lib\site-packages\matplotlib\__init__.py", line 581, in get_configdir
return _get_config_or_cache_dir(_get_xdg_config_dir)
File "C:\laragon\bin\python\python-3.10\lib\site-packages\matplotlib\__init__.py", line 536, in _get_config_or_cache_dir
configdir = Path.home() / ".matplotlib"
File "C:\laragon\bin\python\python-3.10\lib\pathlib.py", line 1000, in home
return cls("~").expanduser()
File "C:\laragon\bin\python\python-3.10\lib\pathlib.py", line 1440, in expanduser
raise RuntimeError("Could not determine home directory.") RuntimeError: Could not determine home directory.
我可能可以摆脱使用shell_exec,但我仍然想知道为什么会发生这种情况,以及如何解决它,因为这可能对任何未来的项目有帮助。
如果这是任何有用的idk,这里是Python脚本的代码片段,可能会给给予另一个提示?
# Import libraries
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import os
# Read file
script_dir = os.path.dirname(os.path.realpath(__file__))
file_path = os.path.join(script_dir, 'Sample Data.xlsx')
data = pd.read_excel(file_path)
Python脚本的其余部分只是常见的get、train、test data和show graph。
我尝试了ChatGPT,但它一直告诉我一些关于操作系统的事情,我在互联网上搜索它,发现一个stackoverflow帖子说要手动设置操作系统,我尝试了,但仍然不起作用。ChatGPT给出了非常相似的响应btw. Link 1所以在Python脚本中我尝试,
# Import libraries
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import os
os.environ['HOME'] = 'C:/laragon/bin/python/python-3.10/lib/site-packages/matplotlib/__init__.py'
# os.environ['HOME'] = 'C:/laragon/bin/python/python-3.10/python.exe'
# Read file
script_dir = os.path.dirname(os.path.realpath(__file__))
file_path = os.path.join(script_dir, 'Sample Data.xlsx')
data = pd.read_excel(file_path)
那么这是最相关的帖子,但根本没有帮助。Link 2
提前感谢!
更新:解决了这个问题!下面是代码片段。
# SET THIS OS SETTINGS BEFORE IMPORTING MATPLOTLIB!!!
# Set the custom path
import os
os.environ['MPLCONFIGDIR'] = "C:/laragon/www/DLTP-1/public/python"
# os.environ['MPLCONFIGDIR'] = "< your/custom/path >"
import matplotlib.pyplot as plt
在我的情况下,我不得不使用'MPLCONFIGDIR'。以下是ChatGPT的解释:
“环境变量名MPLCONFIG是Matplotlib特有的。Matplotlib查找这个特定的环境变量来确定它的配置目录的位置。
为环境变量使用不同的名称不起作用的原因是Matplotlib的代码是专门为查找MPLCONFIG变量而设计的。当Matplotlib调用时,它会检查此变量的存在并将其值用作配置目录。
如果你想为环境变量使用不同的名称,你需要修改Matplotlib源代码来查找特定的变量名称。这需要修改Matplotlib软件包本身,除非你有特定的需要,否则不建议这样做。
一般来说,在使用Matplotlib时,最好坚持使用标准变量名MPLCONFIGURITY。这可以确保与库的兼容性,并避免任何潜在的问题或冲突。”
1条答案
按热度按时间6qftjkof1#
在导入时,
matplotlib
会在内部检查当前用户的主目录中的配置文件。这是使用pathlib.Path.home
完成的。如果您跟踪源代码中的调用链(1,2,3,4),您可以看到这最终会调用os.path.expanduser
。在Windows上,
os.path.expanduser
依赖于某些环境变量来解析主目录。特别是USERPROFILE
或HOMEPATH
和HOMEDRIVE
。很可能当服务器调用脚本时,这些变量没有被设置。
您可以在导入
matplotlib
* 之前手动setting theUSERPROFILE
environment variable * 来解决此问题:请注意,您不需要将
USERPROFILE
设置为实际的主目录,除非您希望使用其中的配置文件。