Я исследовал это дальше, и оказалось, что это довольно фундаментальная проблема.Модуль socket
, реализованный на уровне библиотеки (внутри каталогов lib
), по сути, является пустой оболочкой для библиотеки _socket
, которая представляет собой модуль уровня интерпретатора, определенный в каталоге pypy/module
.Для тех, кто не знаком с PyPy, есть два типа модулей, которые можно импортировать, примерно соответствующие библиотекам чистого Python и C в CPython.Модули, реализованные на уровне библиотеки, могут быть легко включены в изолированную программную среду и фактически включены в изолированную программную среду pypy_interact
по умолчанию.Тем не менее, модули, написанные на уровне интерпретатора, недоступны внутри песочницы.
Похоже, мой подход был ошибочным из-за этого критического различия.Вместо этого есть несколько других вариантов, которые вы можете рассмотреть, если столкнетесь с той же проблемой:
- Используйте
os.open
напрямую с именем файла, начинающимся с tcp://
.Это на самом деле работает очень хорошо и мой любимый подход. - Реализуйте свою собственную
socket
библиотеку.Это, конечно, не является предпочтительным, но я считаю, что было бы возможно создать относительно пустую библиотеку сокетов, которая просто взаимодействует с контроллером песочницы, как описано выше, оборачивая функциональность сокетов.Возможно даже изменить библиотеку сокетов по умолчанию для достижения этого (например, без включения _socket
).