Pyodide中无法导入自定义Python包的问题求助
解决Pyodide导入自定义包失败的问题
出现ModuleNotFoundError: No module named 'package'的核心原因是:Pyodide运行在浏览器的虚拟文件系统中,本地的package目录不会自动映射到这个虚拟环境里,Python解释器找不到对应的模块文件。
解决步骤
需要手动将本地自定义包的文件写入Pyodide的虚拟文件系统,并确保模块所在目录被添加到Python的搜索路径中,以下是两种可行方案:
方案一:直接在JS中写入模块代码
修改index.html中的脚本部分,先创建虚拟目录并写入__init__.py的内容:
<!DOCTYPE html> <html> <head> <script src="https://cdn.jsdelivr.net/pyodide/v0.19.1/full/pyodide.js"></script> </head> <body> Pyodide test page <br /> Open your browser console to see Pyodide output <script type="text/javascript"> async function main() { let pyodide = await loadPyodide({ indexURL: "https://cdn.jsdelivr.net/pyodide/v0.19.1/full/", }); // 在虚拟文件系统中创建package目录 pyodide.FS.mkdir("/package"); // 写入__init__.py的内容(替换成你实际的代码) pyodide.FS.writeFile("/package/__init__.py", ` def main(): print("Hello from custom package!") `); // 将虚拟根目录添加到Python搜索路径 pyodide.runPython(` import sys sys.path.insert(0, '/') `); let mypkg = pyodide.pyimport("package"); mypkg.main(); } main(); </script> </body> </html>
方案二:加载本地的模块文件
如果你的__init__.py已有现成代码,可以通过fetch获取本地文件内容再写入虚拟文件系统:
<!DOCTYPE html> <html> <head> <script src="https://cdn.jsdelivr.net/pyodide/v0.19.1/full/pyodide.js"></script> </head> <body> Pyodide test page <br /> Open your browser console to see Pyodide output <script type="text/javascript"> async function main() { let pyodide = await loadPyodide({ indexURL: "https://cdn.jsdelivr.net/pyodide/v0.19.1/full/", }); // 创建虚拟package目录 pyodide.FS.mkdir("/package"); // 读取本地的__init__.py文件 const response = await fetch("./package/__init__.py"); const content = await response.text(); // 写入虚拟文件系统 pyodide.FS.writeFile("/package/__init__.py", content); // 添加路径到Python搜索列表 pyodide.runPython(` import sys sys.path.insert(0, '/') `); let mypkg = pyodide.pyimport("package"); mypkg.main(); } main(); </script> </body> </html>
注意事项
- 确保本地服务器运行:如果直接打开
index.html(file://协议),fetch可能会因为跨域问题失败,建议用本地服务器(比如python -m http.server)运行页面。 - 版本匹配:如果使用其他版本的Pyodide,API逻辑基本一致,但注意检查
FS相关方法是否有变动。
内容的提问来源于stack exchange,提问作者Sanskar Jethi
相关产品推荐
相关产品推荐

