Как защитить свой Python кодовым, так что гости не могут видеть некоторые модули, но так до сих пор работает?

голоса
3

Мы начинаем новый проект в Python с несколькими фирменными алгоритмами и чувствительных битов логики, которые мы хотели бы сохранить в тайне. Мы также будем иметь несколько аутсайдеров (выбор членов общественности), работающих на коде. Мы не можем предоставить аутсайдеры доступ к небольшим частным бит кода, но мы хотели бы публичная версия работать достаточно хорошо для них.

Говорят , что наш проект, Foo, имеет модуль, barс одной функцией, get_sauce(). Что на самом деле происходит в get_sauce()это секрет, но мы хотим , чтобы публичная версия get_sauce()для возвращения приемлемой, хотя и неверный, результат.

Мы также запустить свой собственный сервер Subversion, поэтому мы имеем полный контроль над тем, кто может получить доступ к чему.

Symlinks

Моя первая мысль была символической ссылка - Вместо того bar.py, предоставить bar_public.pyвсем и bar_private.pyтолько внутренние разработчикам. К сожалению, создание символических ссылок является утомительной, ручной работой - особенно , когда там действительно будет около двух десятков этих частных модулей.

Что еще более важно, это делает управление файлом AuthZ Subversion сложно, так как для каждого модуля мы хотим защитить должны быть добавлены на сервере исключение. Кто-то может забыть это сделать и случайно проверить в секретах ... Тогда модуль в репо, и мы должны перестроить хранилище без него и надеюсь, что посторонний человек не загрузить его в то же время.

Несколько хранилищ

Следующая мысль была иметь два хранилища:

private
└── trunk/
    ├── __init__.py
    └── foo/
        ├── __init__.py
        └── bar.py
public
└── trunk/
    ├── __init__.py
    └── foo/
        ├── __init__.py
        ├── bar.py
        ├── baz.py
        └── quux.py

Идея заключается в том , что только внутренние разработчики смогут оформить как private/и public/. Внутренние разработчики установят их PYTHONPATH=private/trunk:public/trunk, но все остальные будут просто установить PYTHONPATH=public/trunk. Тогда, как инсайдеры и аутсайдеры могут from foo import barи получить правильный модуль, верно?

Давайте попробуем это:

% PYTHONPATH=private/trunk:public/trunk python
Python 2.5.1
Type help, copyright, credits or license for more information.
>>> import foo.bar
>>> foo.bar.sauce()
'a private bar'
>>> import foo.quux
Traceback (most recent call last):
  File <stdin>, line 1, in <module>
ImportError: No module named quux

Я не эксперт в Python, но мне кажется , что Python уже сделал свой ум о модуле fooи поиск по отношению к тому , что:

>>> foo
<module 'foo' from '/path/to/private/trunk/foo/__init__.py'>

Даже не удаление fooпомогает:

>>> import sys
>>> del foo
>>> del sys.modules['foo']
>>> import foo.quux
Traceback (most recent call last):
  File <stdin>, line 1, in <module>
ImportError: No module named quux

Можете ли вы предоставить мне лучшее решение или предложение?

Задан 18/09/2009 в 09:05
источник пользователем
На других языках...                            


3 ответов

голоса
3

В __init__способе fooпакета можно изменить , __path__чтобы сделать его для своих модулей в других каталогах.

Так создайте каталог secretи поместите его в частном хранилище Subversion. В secretкладут частную собственность bar.py. В __init__.pyобщественной fooупаковке положить в чем - то вроде:

__path__.insert(0,'secret')

Это будет означать для пользователей, имеющих личное хранилище и поэтому secretкаталог они получат фирменные , bar.pyкак foo.barв secretпервом каталог в пути поиска. Для других пользователей, Python не найдет secretи будет выглядеть как следующий каталог в __path__и так будет загружать нормальный bar.pyиз foo.

Так это будет выглядеть примерно так:

   private
    └── trunk/
        └── secret/
            └── bar.py
    public
    └── trunk/
        ├── __init__.py
        └── foo/
            ├── __init__.py
            ├── bar.py
            ├── baz.py
            └── quux.py
Ответил 18/09/2009 в 09:36
источник пользователем

голоса
2

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

Плагин система изобилует. Вы можете легко сделать мертвый простые из них самостоятельно. Если вы хотите что-то более продвинутое я предпочитаю архитектуры Zope компонентов, но есть и варианты, как Setuptools entry_points и т.д.

Какой из них использовать в вашем случае будет хорошим вторым вопросом.

Ответил 18/09/2009 в 09:44
источник пользователем

голоса
0

Вот альтернативное решение , которое я заметил, читая документы для Настой :

flaskext/__init__.py

Единственная цель этого файла, чтобы пометить пакет как пакет пространства имен. Это необходимо для того, что несколько модулей из разных пакетов PyPi могут находиться в том же пакете Python:

__import__('pkg_resources').declare_namespace(__name__)

Если вы хотите точно знать, что там происходит, проверка на документы или распространение Setuptools, которые объясняют, как это работает.

Ответил 07/07/2010 в 08:19
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more