This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Embedded 3.6.1 distribution cannot find _socket module
Type: behavior Stage: resolved
Components: Windows Versions: Python 3.6
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: ThomasS, paul.moore, steve.dower, tim.golden, zach.ware
Priority: normal Keywords:

Created on 2017-05-23 23:46 by ThomasS, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (4)
msg294297 - (view) Author: Thomas Stevenson (ThomasS) Date: 2017-05-23 23:46
Trying to import the socket module using the embedded distribution for 3.6.1, I get the error: <class 'ModuleNotFoundError'>: No module named '_socket'

Running with the standard interpreter works:

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)]
 on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from socket import *
>>>

via an embedded C++ call, however, <class 'ModuleNotFoundError'>: No module named '_socket' is the error returned.
msg294480 - (view) Author: Zachary Ware (zach.ware) * (Python committer) Date: 2017-05-25 14:18
I suspect you'll need to set sys.path (PySys_SetPath, I think, but trust the docs more than me).  Try importing sys and printing sys.path to confirm.
msg294491 - (view) Author: Steve Dower (steve.dower) * (Python committer) Date: 2017-05-25 15:50
I've been meaning to get to looking at this issue for a couple of days now, sorry.

There are two critical pieces here:
* don't delete or move _socket.pyd
* don't delete or move python36._pth (but possibly update it)

The first one should be obvious - I assume you haven't messed that bit up :)

The second one is the "static" way of setting sys.path, as Zach suggests. By default, it should include 'python36.zip' and '.', which is the directory containing python36._pth and python36.dll. If you move any of these around, sys.path will be automatically inferred, which could break things.

Further, if you move/remove python36._pth, the registry and environment will be used to locate files rather than only looking in the application directory. This may be bad.

One final tip - you can rename python36._pth to your_exe_name._pth if you want, and if you are embedding then you can get roughly equivalent behaviour using PySys_SetPath.

If none of this works, we'll need you to provide some information about your application, especially the code used to initialize the interpreter, import socket, and the layout of all the files in your app. (Right now, you're asking us to guess basically every detail that is relevant to the bug, hence we're replying with "read the docs" and "try everything" rather than a specific fix ;) )
msg294738 - (view) Author: Thomas Stevenson (ThomasS) Date: 2017-05-30 04:41
Thank you Steve and Zachary.  The context you provided helped me track it down, so I have marked this closed.  In case it benefits anyone in future as well, I ran into a subsequent topic where the C++ app was compiled in debug and hence the actual file being looked for was _socket_d.pyd which is not in the embedded distributable of course.

Thanks again for taking the time to provide your insights.

Thomas
History
Date User Action Args
2022-04-11 14:58:46adminsetgithub: 74631
2017-05-30 04:41:20ThomasSsetstatus: open -> closed
resolution: not a bug
messages: + msg294738

stage: resolved
2017-05-25 15:50:34steve.dowersetmessages: + msg294491
2017-05-25 14:18:39zach.waresetmessages: + msg294480
2017-05-23 23:46:11ThomasScreate