为啥 CPython 3.4.3 不能导入“_socket”模块?

Posted

技术标签:

【中文标题】为啥 CPython 3.4.3 不能导入“_socket”模块?【英文标题】:Why isn't CPython 3.4.3 able to import '_socket' module?为什么 CPython 3.4.3 不能导入“_socket”模块? 【发布时间】:2016-02-16 09:13:31 【问题描述】:

我有一个 C++ 程序,它嵌入了 python 3.4.3+。我正在尝试运行一个使用名为requests 的模块的脚本,该模块依赖于socket,但嵌入式解释器无法导入_socket

Python 版本和调用栈

3.4.3+ (3.4:f4cd9ac378d7+, Feb 16 2016, 21:24:03) [MSC v.1800 32 bit (Intel)]
Traceback (most recent call last):
  File "<project path>\client_example.py", line 30, in <module>
    import requests
  File "F:\Python 3.4.3\lib\site-packages\requests\__init__.py", line 58, in <module>
    from . import utils
  File "F:\Python 3.4.3\lib\site-packages\requests\utils.py", line 12, in <module>
    import cgi
  File "F:\Python 3.4.3\Lib\cgi.py", line 39, in <module>
    from email.parser import FeedParser
  File "F:\Python 3.4.3\Lib\email\parser.py", line 12, in <module>
    from email.feedparser import FeedParser, BytesFeedParser
  File "F:\Python 3.4.3\Lib\email\feedparser.py", line 27, in <module>
    from email import message
  File "F:\Python 3.4.3\Lib\email\message.py", line 16, in <module>
    from email import utils
  File "F:\Python 3.4.3\Lib\email\utils.py", line 29, in <module>
import socket
  File "F:\Python 3.4.3\Lib\socket.py", line 49, in <module>
    import _socket
ImportError: No module named '_socket'

我也知道_socket.pyd 位于 python 安装位置的 DLL 中,但我不知道它是否也应该位于其他位置。

如何让程序的嵌入式解释器找到_socket 模块?

【问题讨论】:

【参考方案1】:

您是否尝试过打开 python 终端并加载套接字库? (即“导入套接字”) 我看到您正在使用 MSVC,这意味着您正在使用 Windows。要打开 python 终端,请打开命令提示符,只需键入 python 并按 enter。你现在在 python 终端中。

如果还是不行,说明python安装有问题。

另一件事,如果您使用正确的 python 安装程序安装了 python,那么问题很可能不是由于安装错误造成的。

最好的问候。

【讨论】:

是的,我已经运行了python终端并成功导入了socket和_socket。这个问题似乎只存在于嵌入式解释器中。 嗯,我想几个月前我也遇到过类似的问题。您是否创建了 python 的环境变量? (PYTHONHOME,PYTHONPATH)。我认为通过将指向 python 的 Lib 文件夹的方向插入到 PYTHONPATH 变量中,这对我来说是固定的。就我而言,我无法加载 numpy(一个站点包),并且通过使用 PYTHONPATH 我设法加载了它! 我目前无法检查和尝试,但我会在明天尝试并报告!【参考方案2】:

尝试将模块的路径添加到python:

sys.path.append(path/to/module)

这应该允许您导入模块。

【讨论】:

我今天晚些时候回家试试这个。【参考方案3】:

这发生在我在 VS 2019 中调试我的 c++ 应用程序时。

因为 Python 缺少调试编译的文件:_d.dll _d.pyd *d_.lib

解决方案:

    下载源代码并构建您的调试版本 Debug Version Build

    从 .\PCbuild\amd64 复制到你的 python 目录

    *._d.dll ==> .\%PYTHONHOME%\ *._d.pyd ==> .\%PYTHONHOME%\DLLs *._d.pdb ==> .\%PYTHONHOME%\DLLs *._d.lib ==> .\%PYTHONHOME%\libs

    设置环境变量%PYTHONHOME%%PYTHONPATH%

    将路径添加到 sys.path

    PyObject* sys_path = PySys_GetObject("path");
    retVal = PyList_Append(sys_path, PyUnicode_FromString("C:\\Python38_64\\DLLs"));
    

    再次尝试调试 ;-)

【讨论】:

以上是关于为啥 CPython 3.4.3 不能导入“_socket”模块?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CPython 字典不受负一和负二的哈希值的影响

如果 PyPy 快 6.3 倍,为啥我不应该使用 PyPy 而不是 CPython?

为啥对 Python 值的引用(即函数参数)存储在 CPython 的堆栈(帧)中?

Python为啥不能用列表遍历来删除列表中的相同的元素呢?

Emscripten 交叉编译的 CPython 中出现奇怪的导入错误

为啥 Cython 编译器会生成带有后缀“cpython-35m-x86_64-linux-gnu.so”的 so