Насколько мне известно, "текущая" лучшая практика:
- pip управляет зависимостями
- setup.py выполняет сборку
Выполнение"pip install."почти эквивалентно выполнению «pip install -r needs.txt» + «python setup.py build» + «python setup.py install».
Это пользовательская команда, которая генерирует исходные коды Python из прототипов:
class GrpcTool (Command):
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
import grpc_tools.protoc
proto_include = pkg_resources.resource_filename('grpc_tools', '_proto')
grpc_tools.protoc.main([
'grpc_tools.protoc',
'-I{}'.format(proto_include),
'--python_out=SOME_PATH/',
'--grpc_python_out=SOME_PATH/',
'SOME_PROTO.proto'
])
, который вызывается для настройки команды build_py, например:
class BuildPyCommand (build_py):
def run(self):
self.run_command('grpc')
super(BuildPyCommand, self).run()
Обратите внимание на импорт внутри метода run.Кажется, что pip запускает setup.py несколько раз, как до, так и после установки требований.Так что если у вас есть импорт поверх файла, сборка завершится неудачей.