2015-09-03 5 views
0

Я пишу скрипт, который использует модули MySQLdb и pymssql. Я использую python 2.7. Мне нужно запустить этот скрипт на компьютере (Linux), на котором у меня нет прав на установку модулей или добавление к переменной пути.Использование модулей python без установки

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

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

Редактировать: Скрипт будет запущен на нескольких хостах, поэтому я стараюсь избегать установок любого типа.

+0

Сценарий будет запускаться автоматически на разных компьютерах (тот же дистрибутив и одна версия python, но разные хосты), поэтому мне нужно сделать этот сценарий как можно более независимым. Он может быть развернут с дополнительными файлами. –

ответ

1

Вы часто можете установить пакеты локально с помощью

$ python setup.py install --user 

Это не требует разрешения на установку.

Альтернативой является установка (или добавление) вашего PYTHONPATH. В Баш:

$ export PYTHONPATH=${PYTHONPATH}:/path/to/package-base 

Пакет «база» каталог часто подкаталог имени пакета, в то время как, например, setup.py обычно находится в одном каталоге вверх.

Если вам не нравится изменение среды, вы можете сделать его одноразовым:

$ PYTHONPATH=${PYTHONPATH}:/path/to/package-base python /some/script.py 

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


Наконец, вы также можете попробовать создать Python virtual environment. Подробнее об этом см. В связанной документации или в поиске.

+0

Проблема с локальной установкой пакетов заключается в том, что она очень неспортивна ... как только я оказался в подобной ситуации, и у меня действительно были проблемы с получением зависимостей моей программы от моих сверстников. – bgusach

+0

Я пытаюсь избежать любой личной установки, потому что я не могу контролировать, какой компьютер будет запускать скрипт. как сказал ikaros45. –

+0

Локальная установка - это установка * для пользователя *; так что да, это не сработает для других пользователей, использующих вашу установку. Но то же самое происходит в виртуальной среде. Тогда PYTHONPATH станет вашим решением. – Evert

1

Вы можете попробовать скопировать все свои зависимости в специальную папку, свой собственный app-packages или около того, а затем в начале вашей программы вы добавили бы путь каждой зависимости в sys.path, чтобы импорт работал. Конечно, когда вы распространяете свой код, вам придется включить «бумажную копию» всех необходимых вам пакетов, то есть app-packages.

Что-то вроде этого:

# At the beginning of your programme 
import sys 
sys.path.extend([all the paths of your packages inside of app-packages]) 

Это не должно быть трудно автоматизировать. Вы можете сканировать все элементы в app-packages и добавить их в путь. Опционально с фильтрацией для .egg, .zip и т. Д. Расширения. Некоторые не тестировалось код, это может быть:

import os 
import sys 
dep_folder = 'app-packages' # asuming your main script is placed where app-packages is 
dependencies = [os.path.join(dep_folder, dep) for dep in os.listdir(dep_folder)] # optionally you can filter here 

sys.path.extend(dependencies) 

Таким образом, когда позже на import pymssql ударил, механизм импорта также будет выглядеть в пути, которые вы добавили.

Другой вариант - использовать virtual environment.Там у вас не возникнет проблем с установкой зависимостей через pip, но я ожидаю, что это будет непросто распространять.

+0

Я думал об этом, но скрипт будет работать на некоторых узлах с пользователями, у которых нет прав на изменение переменных env ... –

+0

Вы всегда можете запустить скрипт, который не устанавливает или не изменяет переменные среды, добавляя PYTHONPATH в командной строке: 'PYTHONPATH = python ' – Evert

+0

@JohnEllis, изменение 'sys.path' не требует никакого разрешения и не изменяет никакой переменной среды. Это всего лишь объект в куче процесса. Когда процесс будет завершен, эти изменения больше не будут существовать. – bgusach

Смежные вопросы