Py_Initialize引发ModuleNotFoundError:没有名为“编码”的模块

时间:2019-02-08 11:12:14

标签: python c macos anaconda scons

我正在尝试在MacOS的https://docs.python.org/3/extending/embedding.html#very-high-level-embedding上运行“在另一个应用程序中嵌入Python”示例。虽然我可以使程序与我的Python3.7和SCons的Anaconda发行版一起编译,但是运行它总是会引发以下错误:

Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

我通过将PYTHONHOME变量设置为/ usr / local,Anaconda根目录以及Python可执行文件的父目录,尝试了此StackOverflow帖子How can I troubleshoot Python "Could not find platform independent libraries <prefix>"上给出的建议。我也尝试将PYTHONPATH变量设置为每个文件夹。但是,设置PYTHONHOME将导致我的Anaconda安装Python崩溃,并显示以下消息:

Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

我没有设置任何Python虚拟环境,并且在此嵌入示例之外并设置了PYTHONHOME变量,Python运行良好。另外,Anaconda Python二进制文件的父文件夹是PATH变量中的第一个文件夹,因此我知道Py_Initialize不会首先找到Python的默认MacOS安装。我尝试卸载并重新安装Anaconda,但仍然存在相同的错误。以下代码是我的SConstruct文件,用于编译示例。

env = Environment(
    CPPPATH=[
        "/Users/user/anaconda3/include",
        "/Users/user/anaconda3/include/python3.7m"
    ],
    LIBPATH=["/Users/user/anaconda3/lib/python3.7/config-3.7m-darwin"],
    LIBS=["dl", "python3.7m"]
)

env.Program("wrapper", "wrapper.c")

任何帮助或建议,我们将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

这将取决于python库的设置方式。我假设他们正在使用RPATH,在这种情况下,您可以像这样创建环境:

env = Environment(
    CPPPATH=[
        "/Users/user/anaconda3/include",
        "/Users/user/anaconda3/include/python3.7m"
    ],
    LIBPATH=["/Users/user/anaconda3/lib/python3.7/config-3.7m-darwin"],
    LIBS=["dl", "python3.7m"],
    LINKFLAGS='-rpath /Users/user/anaconda3/lib/python3.7/config-3.7m-darwin'
)

env.Program("wrapper", "wrapper.c")

在该配置文件夹中应该有一些动态库,您可以在其中运行otool:

otool -L libpython3.7.dylib

应该打印链接程序如何链接库。

您可以在此处找到更多信息:

https://stackoverflow.com/a/31824839/1644736 https://wincent.com/wiki/@executable_path,_@load_path_and_@rpath