Как инкапсулировать модули Python? - PullRequest
2 голосов
/ 19 сентября 2009

Можно ли инкапсулировать модули Python 'mechanize' и 'BeautifulSoup' в один файл .py?

Моя проблема заключается в следующем: у меня есть скрипт Python, который требует Mechanize и BeautifulSoup.Я звоню со страницы php.Сервер веб-хостинга поддерживает Python, но не имеет установленных модулей.Вот почему я хотел бы сделать это.

Извините, если это глупый вопрос.

edit: Спасибо всем за ваши ответы.Я думаю, что решение для этого решает вокруг virtualenv.Может ли кто-нибудь быть настолько любезным, чтобы объяснить мне это очень простыми словами?Я прочитал страницу virtualenv, но все еще в замешательстве.Еще раз спасибо.

Ответы [ 3 ]

4 голосов
/ 19 сентября 2009

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

Среда выполнения Python выполняет поиск библиотек в каталогах в массиве sys.path. Вы можете добавить каталоги в этот массив во время выполнения, используя переменную окружения PYTHONPATH или явно добавляя элементы в sys.path. Приведенный ниже фрагмент кода, добавленный в скрипт Python, добавляет каталог, в котором находится скрипт, к пути поиска, неявно делая любые библиотеки, расположенные в том же месте, доступными для импорта:

import os, sys
sys.path.append(os.path.dirname(__file__))
2 голосов
/ 19 сентября 2009

Проверьте virtualenv, чтобы создать локальную установку на python, где вы можете установить BeautifulSoup и все другие необходимые вам библиотеки.

http://pypi.python.org/pypi/virtualenv

0 голосов
/ 19 сентября 2009

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

>>> sha=types.ModuleType("sha")
>>> sha
<module 'sha' (built-in)>
['__doc__', '__name__']
>>> sha.foo=3
>>> sha.zam=types.ModuleType("zam")
>>> sha.foo
3
>>> dir(sha)
['__doc__', '__name__', 'foo', 'zam']

Но в любом случае вам придется сгенерировать код, который создает этот макет и сохраняет его в правильно названных идентификаторах.

Что вам нужно, это, вероятно, научиться использовать файлы .egg. Это уникальные агломерированные объекты, содержащие вашу библиотеку, например файлы .jar.

...