Использование модуля сокета в изолированной Pypy - PullRequest
6 голосов
/ 11 июля 2011

Я пытаюсь разрешить подпроцессу в песочнице с Pypy взаимодействовать, используя ограниченный протокол, с родительским процессом.

После просмотра исходного кода pypy/pypy/translator/sandbox/sandlib.py, включенного в Pypy, кажется, чтоVirtualizedSocketProc позволяет os.open звонкам открывать сокеты.Я изменил некоторые функциональные возможности кода (например, разрешив TCP-соединения на ограниченных портах), но очень мало что изменилось.Однако я не могу импортировать модуль Pypy socket, потому что для этого требуется несуществующий модуль _socket, который, кажется, находится в частях кода на уровне интерпретатора.

Это то, что яПытаюсь сделать осуществимым?Если да, то как мне импортировать модуль сокета?Если нет, что еще я могу сделать?

1 Ответ

4 голосов
/ 15 июля 2011

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

Похоже, мой подход был ошибочным из-за этого критического различия.Вместо этого есть несколько других вариантов, которые вы можете рассмотреть, если столкнетесь с той же проблемой:

  1. Используйте os.open напрямую с именем файла, начинающимся с tcp://.Это на самом деле работает очень хорошо и мой любимый подход.
  2. Реализуйте свою собственную socket библиотеку.Это, конечно, не является предпочтительным, но я считаю, что было бы возможно создать относительно пустую библиотеку сокетов, которая просто взаимодействует с контроллером песочницы, как описано выше, оборачивая функциональность сокетов.Возможно даже изменить библиотеку сокетов по умолчанию для достижения этого (например, без включения _socket).
...