Ho un progetto Python che utilizza setuptools per la distribuzione e ho seguito principalmente this guide per quanto riguarda la struttura del progetto. Il progetto utilizza i buffer del protocollo Google per definire un formato di messaggio di rete. Il mio problema principale è come rendere setup.py chiamare il protoc-compiler durante l'installazione per creare le definizioni in un file _pb2.py.Progetto Python utilizzando buffer di protocollo, Problemi di distribuzione
In this question è stato consigliato di distribuire solo i file _pb2.py risultanti insieme al progetto. Mentre questo potrebbe funzionare per piattaforme molto simili, ho trovato diversi casi in cui questo non funziona. Ad esempio, quando sviluppo su un Mac che utilizza Anaconda Python e copio il risultante _pb2.py insieme al resto del progetto in un Raspberry Pi su cui è in esecuzione Raspbian, ci sono sempre errori di importazione provenienti dai moduli _pb2.py. Tuttavia, se compilo i file .proto di recente sul Pi, il progetto funziona come previsto. Quindi, la distribuzione dei file compilati non sembra un'opzione.
Tipo di ricerca di soluzioni di lavoro e di buone pratiche qui. Si può presumere che il protoc-compilatore sia installato sulla piattaforma di destinazione.
Edit:
Dal momento che le persone chiedono le ragioni del fallimento. Su Mac, la versione di protobuf è 2.6.1. e sul Pi è il 2.4.1. Apparentemente, l'API interna utilizzata dall'output del compilatore di protoc generato è cambiata. L'output è fondamentalmente:
File "[...]network_manager.py", line 8, in <module>
import InstrumentControl.transports.serial_bridge_protocol_pb2 as protocol
File "[...]serial_bridge_protocol_pb2.py", line 9, in <module>
from google.protobuf import symbol_database as _symbol_database
ImportError: cannot import name symbol_database
ho avuto problemi simili, e sempre compilata sulla PI. Il problema deriva da AFAIR da diverse versioni di protobuf. Quindi - quali versioni hai sulle rispettive macchine e non puoi aggiornarle allo stesso modo? – deets
Mi piacerebbe davvero evitarlo. Posso (probabilmente) farlo sulle macchine che controllo ma non mi sembra il modo giusto per farlo. E probabilmente fallisce quando si distribuisce il software ad altri. Facendoli installare una versione specifica dei buffer di protocollo quando la loro versione corrente potrebbe (ri-compilando) essere usata, non sembra giusta. – jan
Hai cercato - cosa causa errori di importazione? Vorrei scegliere la strategia di packaging _pb2.py files e ricercare i problemi di errore di importazione. –