Grazie mille per aver postato questa domanda e una soluzione. Ho adottato un approccio leggermente diverso che potrebbe anche essere utile. È piuttosto difficile trovare suggerimenti utili per i servizi Python, e tanto meno farlo con un virtualenv. Comunque ...
Passi
Questo sta usando Windows 7 x64, Python 3.5.1 x64, pywin32-220 (o pypiwin32-219).
- Aprire un prompt dei comandi di amministratore.
- Creare un virtualenv.
C:\Python35\python -m venv myvenv
- Attiva il virtualenv.
call myvenv\scripts\activate.bat
- Installare pywin32, sia:
- Eseguire lo script post-installazione
python myvenv\Scripts\pywin32_postinstall.py -install
.
- Questo script registra le DLL nel sistema e le copia su
C:\Windows\System32
. Le DLL sono denominate pythoncom35.dll
e pywintypes35.dll
. Così ambienti virtuali sulla stessa macchina sulla stessa major release punto Python condivideranno questi ... si tratta di un compromesso minore :)
- Copia
myvenv\Lib\site-packages\win32\pythonservice.exe
al myvenv\Scripts\pythonservice.exe
- Sulla classe di servizio (qualunque sottoclassi win32serviceutil. ServiceFramework), impostare la proprietà della classe
_exe_path_
in modo che punti a questo exe trasferito. Questo diventerà il servizio binPath. Ad esempio: _exe_path_ = os.path.join(*[os.environ['VIRTUAL_ENV'], 'Scripts', 'pythonservice.exe'])
.
Discussione
Penso che il motivo per cui questo funziona è che Python guarda verso l'alto per capire dove le cartelle Libs sono e sulla base di tale imposta i percorsi di importazione del pacchetto, in modo simile alla risposta accettata. Quando pythonservice.exe si trova nella posizione originale, non sembra funzionare correttamente.
Risolve anche i problemi di collegamento DLL (rilevabile con depends.exe da http://www.dependencywalker.com/). Senza il business DLL risolto, non sarà possibile importare dai file * .pyd da venv\Lib\site-packages\win32
come moduli nei propri script. Ad esempio è necessario consentire import servicemanager
; come servicemanager.pyd
non è incluso nel pacchetto come file .py e ha alcune fantastiche funzionalità di registro eventi di Windows.
Uno dei problemi che ho avuto con la risposta accettata è che non sono riuscito a capire come ottenere per raccogliere in modo accurato sui percorsi package.egg-link che vengono creati quando si utilizza setup.py develop
. Questi file .egg-link includono il percorso del pacchetto quando non si trova nella virtualenv sotto myvenv\Lib\site-packages
.
Se tutto è andato liscio, dovrebbe essere possibile installare, avviare e testare il servizio esempio Win32 (da un prompt Admin nel virtualenv attivato):
python venv\Lib\site-packages\win32\Demos\service\pipeTestService.py install
python venv\Lib\site-packages\win32\Demos\service\pipeTestService.py start
python venv\Lib\site-packages\win32\Demos\service\pipeTestServiceClient.py
Il Servizio Ambiente
altro Nota importante in tutto questo è che il servizio eseguirà il codice Python in un ambiente completamente separato da quello che potresti eseguire python myservice.py debug
. Ad esempio, ad esempio os.environ['VIRTUAL_ENV']
sarà vuoto durante l'esecuzione del servizio. Può essere gestito da:
- Impostare le variabili di ambiente dall'interno dello script, ad es.
- Trova il percorso corrente a partire dal file sys.executable, come descritto nella risposta accettata.
- Utilizzare quel percorso per individuare un file di configurazione.
- Leggere il file di configurazione e inserirli nell'ambiente con
os.environ
.
- Aggiungere le chiavi di registro al servizio con le variabili di ambiente.
fonte
2016-01-22 08:31:08
questione connessa: http://stackoverflow.com/questions/27462582/how-can-i-activate-a-pyvenv-vitrualenv-from-within-python-activate-this-py-was –