2016-01-19 3 views
-1

Так что я надеялся написать свой код более упруго, начиная с вершины в python. Я думал об импорте.Импорт пакетов python с python

Я хочу код работать в системах, где не были установлены необходимые пакеты. Чтобы достичь этого, я надеялся установить пакеты в перспективе с помощью python.

try: 
    import pygame as pg 
except(ImportError): 
    # [install pygame][1] here 
    # Download and run pygame.MSI (windows) 
    # apt-get install python-pygame 

install pygame Из этого конкретного решения я намерен сделать более обобщенную функцию ...

import subprocess as sp 
def imp(inP,name,location): 
    try: 
     exec "import "+inP+" as "+(name if name != "" else "") 
    except ImportError: 
     try: 
      os = ???? 
      if(os == windows): 
       sp.call("pip install "+location,shell=True) 
      if(os == unix): 
       sp.call("sudo apt-get install python-"+inP,shell=True) 
      r = True 
     except Exception: 
      print colPrt("ERROR installing ") + inP 
      r = False 
     try: 
      exec "import "+inP+" as "+(name if name != "" else "") 
     except(ImportError): 
      print colPrt("ERROR importing ") + inP 
      r = False 
    return r 

и поэтому мой один вопрос становится 2. Первым быть лучшим придерживаюсь для установки модулей в перспективе, а второй - как это отличается от среды unix и windows.

Ps, colPrt просто возвращает красный текст на терминал

def colPrt(s): 
    return("\x1B["+"31;40m" + str(s) + "\x1B[" + "0m") 

спасибо за ваши мысли:)

+2

FWIW, я считаю, что 'except (ImportError e)' не является правильным синтаксисом. , , – mgilson

+0

С помощью [python wheels] (http://pythonwheels.com) установите программное обеспечение. Если вы установите зависимости в колесе, они будут установлены, когда ваше программное обеспечение будет установлено. Самое приятное в том, что пользователь сделает любое повышение привилегий, необходимое для установки для вас. – tdelaney

ответ

3

Первый является лучшим практикующим для установки модулей на ходу

Я бы посоветовал не устанавливать модули в перспективе по нескольким причинам:

  1. У пользователей должен быть выбор, хотите ли они установить материал. Большинство пользователей не заинтересованы в том, чтобы сделать этот выбор во время выполнения (и ваша программа не должна запускаться с необходимыми привилегиями для установки подобных вещей в любом случае) ...
  2. Следуйте за первым пунктом - Должны быть установлены зависимости когда ваш пакет будет установлен.
  3. Это загромождает ваш код кучей вещей, которые вы действительно не хотите поддерживать.
  4. Даже если вы его включите, чей код совместим с вашим кодом и последней версией стороннего пакета в Интернете?

стандартная система сборки Python имеет способы взаимодействия с зависимостями, так что, когда ваш пакет получает загружены и установлены (например, через easy_install или pip), то зависимости все должны прийти с ним.

Посмотрите here, чтобы узнать, как упаковать ваш код на Python.

+0

Пока мы на нем, если вы * собираетесь делать это глупое дерьмо, вы должны хотя бы использовать ['importlib.import_module()'] (https://docs.python.org/2/library/importlib .html # importlib.import_module) вместо 'exec'. – Kevin

0

Постарайтесь взглянуть на pip-accel, это оболочка над пипсом, которая работает кросс-платформой. Если у вас нет предустановленной среды python, я хочу порекомендовать вам посмотреть virtualenv. Pip + virtualenv работает как шарм, вам просто нужно написать короткий скрипт python, который будет запускать его с настройками.

В любом случае, если вы будете использовать свои собственные решения, будет очень сложно поддерживать, возможно, однажды ваш босс придет и попросит вас добавить поддержку Mac Os. Лучше написать вам обертку поверх pip + virtualenv, чем реализовать всю логику самостоятельно.

0

Для исключения выпишите только сообщение об ошибке и дайте возможность устанавливать модули на пользователя. Или напишите файл ower setup (install).

На платформах unix/linux python распространяется с помощью easy_install и не пытается ничего устанавливать в фоновом режиме с помощью apt-get. Без разрешений не получится. Само собой.

И мы использовали не только Debian на основе linux :) например. моя стандартная ОС - unix на основе: QNX :)