Требования к установке скрипта Python


Иногда я скачать скрипт Python (из надежного источника), и не могу запустить его из-за отсутствующих зависимостей, которые я должен установить по одному (не requirements.txt предоставляется). Я ищу способ автоматизировать этот процесс. Это похоже на этот вопрос, но я хотел бы определить требования автоматически. Т. е. приведенный скрипт, установите все пакеты это импорт.

Если myscript.py выглядит как:

import pandas
import tensorflow as tf
from keras.models import Sequential

Затем после запуска скрипта (например, bash extract_requirements.sh myscript.py) pandas, tensorflowи keras будет установлен.

Конечно, сценарий может вызвать другой скрипт, который имеет свои зависимости, имена пакетов не всегда совпадают импортировать имена и т. д. Так что это не идеальное решение, но лучше, чем ничего.

Что я использую сейчас-это сценарий командной строки:

#!/env bash

set -u

usage() {
    echo "$0" '[-d] <MY_SCRIPT>'
    cat <<-EOF
        options:
        -d    Dry-run. Print package names without installing.
EOF
    exit 1;
}

(( $# == 0 )) && usage
dry=0
if [[ "$1" == '-d' ]]; then
    dry=1
    shift
fi
(( $# != 1 )) && usage

script="$1"
imports1=$(egrep '^\s*from\s+[a-zA-Z_.-]+\simport' "$script" | cut -f2 -d' ' | cut -f1 -d'.')
imports2=$(egrep '^\s*import\s+[a-zA-Z_-]+' "$script" | cut -f2 -d' ')
all=$(printf "$imports1\n$imports2" | sort -u)
if (( dry )); then
    echo "$all" | xargs -L 1 echo
else
    echo "$all" | xargs -L 1 sudo pip install
fi

set +u

Мне было интересно, если я упускаю какую-то import случаев, и что более важно, есть ли более простой питон-СК, решение.



139
6
задан 15 апреля 2018 в 04:04 Источник Поделиться
Комментарии
1 ответ

!!! Используйте это на свой страх и риск. Возиться с пакетами пользователя-это страшный бизнес !!!

Вы можете обезьяна-патч встроенный import заявление и при встрече ModuleNotFoundError установить, что зависимость отсутствует. Вот небольшой пример script.py. Конечно, вы можете расширить эту функцию несколько файлов или динамически использовать файла в качестве входных данных.

import builtins
import pip
old_import = __import__

def my_import(name, globals=None, locals=None, fromlist=(), level=0):
if globals["__name__"] == "script":
try:
return_args = old_import(name, globals=globals, locals=locals,
fromlist=fromlist, level=level)
except ModuleNotFoundError:
builtins.__import__, temp = old_import, builtins.__import__
pipcode = pip.main(['install', name])
if pipcode != 0:
builtins.__import__ = temp
raise
else:
return_args = old_import(name, globals=globals, locals=locals,
fromlist=fromlist, level=level)
builtins.__import__ = temp
else:
return_args = old_import(name, globals=globals, locals=locals,
fromlist=fromlist, level=level)

return return_args

builtins.__import__ = my_import

import script

и script.py это пользовательский скрипт:

import os
from time import time

import argh # this should be installed

print(time())

Примечание: люди иногда делают такие вещи, как:

try:
import optional_module
except ImportError:
pass # optional all cool

Выше код патчи import сам. Если вы удалите if что лимиты установлены полномочия script вы позволяете рекурсивной установки на все, что ввозится. Когда-нибудь. Даже если это необязательная зависимость для 4-го уровня зависимость тест script типун будет пытаться установить его.

4
ответ дан 15 апреля 2018 в 08:04 Источник Поделиться