Вызов другого установленного пакета в Python - PullRequest
0 голосов
/ 09 июня 2018

Я новичок в Python.Я хочу, чтобы после установки esptool package (pip install esptool) вызвал его основной метод с кучей аргументов в моем приложении.Что-то вроде:

esptool.py -p /dev/ttyUSB0 write_flash -fm qio 0x0000

Есть проблема, с которой я столкнулся.esptool нет в списке пакетов в python для импорта (он уже установлен с pip).Как я собираюсь использовать import и вызвать основной метод?

1 Ответ

0 голосов
/ 09 июня 2018

Решение проблем с импортом

Вы не можете просто вызвать import esptool, потому что esptool.py - это исполняемый скрипт, поэтому он не предназначен для импорта как обычный модуль.Однако есть обходные пути для импорта кода из исполняемых скриптов;Вот два, о которых я знаю:

расширение sys.path

Вы можете расширить sys.path, включив в него биндир, содержащий скрипт esptool.py.Простая проверка из командной строки:

$ PYTHONPATH=$(which esptool.py)/.. python -c "import esptool; esptool.main()"

должен напечатать вам текст справки об использовании.

Расширение sys.path в коде:

import os
import sys

try:
    from shutil import which
except ImportError:
    from distutils.spawn import find_executable as which


bindir = os.path.dirname(which('esptool.py'))
sys.path.append(bindir)  # after this line, esptool becomes importable

import esptool


if __name__ == '__main__':
    esptool.main()

с использованием машин импорта

Вы можете избежать расширения sys.path, используя механизмы импорта кода Python из произвольных файлов.Мне нравится это решение больше, чем возиться с sys.path, но, к сожалению, оно не переносимо между Python 2 и 3.

Python 3.5 +

import importlib.machinery
import importlib.util

from shutil import which


if __name__ == '__main__':
    loader = importlib.machinery.SourceFileLoader('esptool', which('esptool.py'))
    spec = importlib.util.spec_from_loader(loader.name, loader)
    esptool = importlib.util.module_from_spec(spec)
    loader.exec_module(esptool)  # after this line, esptool is imported

    esptool.main()

Python 2.7

import imp
from distutils.spawn import find_executable as which


if __name__ == '__main__':
    esptool = imp.load_source('esptool', which('esptool.py'))
    esptool.main()

Передача аргументов командной строки

Аргументы командной строки хранятся в списке sys.argv, поэтому вам придется временно перезаписать его, чтобы передать аргументы основной функции:

# assuming esptool is imported
import sys

if __name__ == '__main__':
    # save the current arguments
    argv_original = sys.argv[:]
    # overwrite arguments to be passed to esptool argparser
    sys.argv[:] = ['', '-p', '/dev/ttyUSB0', 'write_flash', '-fm', 'qio', '0x0000']
    try:
        esptool.main()
    except Exception:
        # TODO deal with errors here
        pass
    finally:  # restore original arguments
        sys.argv[:] = argv_original
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...