为啥 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”模块?的主要内容,如果未能解决你的问题,请参考以下文章
如果 PyPy 快 6.3 倍,为啥我不应该使用 PyPy 而不是 CPython?
为啥对 Python 值的引用(即函数参数)存储在 CPython 的堆栈(帧)中?