无法从肯定安装在我的 Web 服务器上的 html 脚本访问 python 模块?

Can't access python module from html script which is definitely installed on my web server?

我在我的服务器上安装了一个模块,可以从任何目录导入 python 文件。我已经通过创建一个 test.py 文件和 import module-name 来测试这个,当从命令行 运行 时 returns 没有错误。

但是,当我将模块导入 python 文件时,我的 index.html 中的脚本标记引用了该文件,我收到一条错误消息,指出无法在工作目录中找到该模块.我在这里使用 brython 通过脚本标记调用 python 文件。

示例 index.html 代码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="https://cdn.jsdelivr.net/npm/brython@3.8.9/brython.min.js"> </script>
  </head>
  <body onload="brython()">
    <script type="text/python" src="file-name.py"></script>
  </body>

file-name.pyimport module-name 产生未找到的错误。

关于如何解决这个问题有什么想法吗?

根据 Brython 的文档 Implementation of import,您必须将文件保存在具有 index.html 的文件夹中。

如果你想使用标准模块——比如sysos那么你必须加载brython_stdlib.min.js

<script src="https://cdn.jsdelivr.net/npm/brython@3.8.9/brython_stdlib.min.js"></script>    

当我使用 print( sys.path ) 查看它在哪些文件夹中搜索模块时,它会显示

['http://0.0.0.0:8000', 'moz-extension://dfafe65d-6769-4df9-8940-b084b18c2a0b/js/Lib/site-packages']

当我使用 print( os.getcwd() ) 查看当前工作目录时,它会显示

http://0.0.0.0:8000

Bryton 是 Python 的解释器,它不使用安装在磁盘上的 Python,也不使用它的模块。它在浏览器中运行代码,并使用 AJAX 加载模块,因此它们必须可以通过 URL

访问
http://0.0.0.0:8000/main.py
http://0.0.0.0:8000/other.py

我的文件结构:

project
|
+-- index.html
|
+-- main.py
|
+-- other.py

project/index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="https://cdn.jsdelivr.net/npm/brython@3.8.9/brython.min.js"> </script>
    <script src="https://cdn.jsdelivr.net/npm/brython@3.8.9/brython_stdlib.min.js"></script>    
  </head>
  <body onload="brython()">
    <script type="text/python" src="main.py"></script>
  </body>
</html>  

project/main.py

import sys  # OK
import os   # OK

print('Hello World')
print( sys.path )
print( os.getcwd() )

import other  # OK

import requests   # ERROR 

project/other.py

print('Other File')

已通过服务器测试

python3 -m http.server

编辑:

我尝试在 Linux

上使用软 link 加载模块 requests
ln -s /usr/local/lib/python3.7/dist-packages/requests/ requests

它加载了文件 requests/__init__.py 但它需要其他模块,例如 urllib3 我也必须 link。


编辑:

如果我link

ln -s /usr/local/lib/python3.7/dist-packages/ dist-packages

并添加

sys.path.append('http://0.0.0.0:8000/dist-packages')

然后在 DevTools in Firefox/Chrome(选项卡:Network)我看到它加载了 requests 所需的其他模块,但它需要很长时间时间 - 大概 30 秒。

顺便说一句: 我预计如果模块使用 C/C++ 库可能会出现问题,因为 Brython 而不是执行此代码。 因此,更复杂的模块将需要更多 links(或 link 一些文件夹