Решение проблем с импортом
Вы не можете просто вызвать 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