Saya membuat sketsa arsitektur untuk satu set program yang berbagi berbagai objek yang saling terkait yang disimpan dalam database. Saya ingin salah satu program untuk bertindak sebagai layanan yang menyediakan antarmuka tingkat yang lebih tinggi untuk operasi pada objek ini, dan program lain untuk mengakses objek melalui layanan itu.
Saat ini saya bertujuan untuk kerangka Python dan Django sebagai teknologi untuk mengimplementasikan layanan itu. Saya cukup yakin menemukan cara untuk mengubah program Python di Linux. Namun, ini adalah item spesifikasi opsional yang harus didukung sistem Windows. Saya memiliki sedikit pengalaman dengan pemrograman Windows dan tidak memiliki pengalaman sama sekali dengan layanan Windows.
Apakah mungkin menjalankan program Python sebagai layanan Windows (mis. Jalankan secara otomatis tanpa login pengguna)? Saya tidak perlu harus mengimplementasikan bagian ini, tetapi saya perlu ide kasar bagaimana hal itu akan dilakukan untuk memutuskan apakah akan merancang sepanjang garis ini.
Sunting: Terima kasih atas semua jawaban sejauh ini, mereka cukup komprehensif. Saya ingin tahu satu hal lagi: Bagaimana Windows mengetahui layanan saya? Bisakah saya mengelolanya dengan utilitas Windows asli? Apa yang setara dengan menempatkan skrip start / stop di /etc/init.d?
sumber
Jawaban:
Ya kamu bisa. Saya melakukannya menggunakan pustaka pythoncom yang disertakan dengan ActivePython atau dapat diinstal dengan pywin32 (Python untuk ekstensi Windows).
Ini adalah kerangka dasar untuk layanan sederhana:
Kode Anda akan masuk dalam
main()
metode — biasanya dengan semacam infinite loop yang mungkin terputus dengan memeriksa flag, yang Anda atur di dalamSvcStop
metodesumber
socket.setdefaulttimeout(60)
? Apakah diperlukan untuk layanan, atau hanya disalin dari layanan yang ada? :)Meskipun saya memilih jawaban yang dipilih beberapa minggu yang lalu, sementara itu saya banyak berjuang dengan topik ini. Rasanya seperti memiliki instalasi Python khusus dan menggunakan modul khusus untuk menjalankan skrip karena layanan hanyalah cara yang salah. Bagaimana dengan portabilitas dan semacamnya?
Saya menemukan Service Manager yang luar biasa , yang membuatnya sangat sederhana dan waras untuk berurusan dengan Layanan Windows. Saya pikir karena saya bisa meneruskan opsi ke layanan yang diinstal, saya bisa juga memilih Python saya yang dapat dieksekusi dan meneruskan skrip saya sebagai opsi.
Saya belum mencoba solusi ini, tetapi saya akan melakukannya sekarang dan memperbarui pos ini sepanjang proses. Saya juga tertarik menggunakan virtualenvs di Windows, jadi saya mungkin akan membuat tutorial cepat atau lambat dan tautan ke sini.
sumber
new-service
di PowerShell harus dapat melakukan ini, tetapi memulai (dan memonitor) skrip sebagai layanan jelas melibatkan lebih banyak detail, yang nssm merawatnya dengan sangat baik.Cara paling sederhana adalah dengan menggunakan: NSSM - Non-Sucking Service Manager:
1 - buat unduhan di https://nssm.cc/download
2 - instal program python sebagai layanan: Win prompt as admin
c:> instal nssm.exe, WinService
3 - Di konsol NSSM:
jalur: C: \ Python27 \ Python27.exe
Direktori startup: C: \ Python27
Argumen: c: \ WinService.py
4 - periksa layanan yang dibuat pada services.msc
sumber
Cara termudah untuk mencapai ini adalah dengan menggunakan perintah asli sc.exe:
Referensi:
sumber
Ada beberapa alternatif untuk menginstal sebagai layanan yang secara virtual dapat dijalankan oleh Windows.
Metode 1: Gunakan instsrv dan srvany dari rktools.exe
Untuk Windows Home Server atau Windows Server 2003 (juga berfungsi dengan WinXP), Alat Kit Sumber Daya Windows Server 2003 hadir dengan utilitas yang dapat digunakan bersama-sama untuk ini, disebut instsrv.exe dan srvany.exe . Lihat artikel Microsoft KB ini KB137890 untuk detail tentang cara menggunakan utils ini.
Untuk Windows Home Server, ada pembungkus ramah pengguna yang bagus untuk utilitas ini dinamai " Any Service Installer ".
Metode 2: Gunakan ServiceInstaller untuk Windows NT
Ada alternatif lain menggunakan ServiceInstaller untuk Windows NT (dapat diunduh di sini ) dengan instruksi python tersedia . Berlawanan dengan namanya, ia bekerja dengan Windows 2000 dan Windows XP juga. Berikut adalah beberapa petunjuk cara menginstal skrip python sebagai layanan.
Setelah jawaban awal saya, saya perhatikan ada Q & A terkait erat sudah diposting di SO. Lihat juga:
Bisakah saya menjalankan skrip Python sebagai layanan (di Windows)? Bagaimana?
Bagaimana cara membuat Windows mengetahui layanan yang saya tulis dengan Python?
sumber
NT
akan selalu "bertentangan" dengan namanya, setidaknya tidak dalam pidato programmer-folk. Itu hanya mengacu pada " arsitektur NT ", yang bertentangan dengan " merek NT ". Yang mengatakan, menurut berbicara di wikipedia ini adalah untuk diperdebatkan, karena "itu bukan istilah Microsoft resmi", tetapi masih ada tradisi dengan garis pemikiran ini.Penjelasan langkah demi langkah cara membuatnya bekerja:
1- Pertama buat file python sesuai dengan kerangka dasar yang disebutkan di atas. Dan simpan ke jalur misalnya: "c: \ PythonFiles \ AppServerSvc.py"
2 - Pada langkah ini kita harus mendaftarkan layanan kita.
Jalankan command prompt sebagai administrator dan ketik:
argumen pertama binpath adalah jalur python.exe
Argumen kedua dari binpath adalah path dari file python Anda yang telah kami buat
Jangan lewatkan bahwa Anda harus meletakkan satu spasi setelah setiap tanda " = ".
Maka jika semuanya baik-baik saja, Anda akan melihat
Sekarang layanan python Anda diinstal sebagai layanan windows sekarang. Anda dapat melihatnya di Manajer Layanan dan registri di bawah:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ TestService
3 - Ok sekarang. Anda dapat memulai layanan Anda pada manajer layanan.
Anda dapat menjalankan setiap file python yang menyediakan kerangka layanan ini.
sumber
SetEvent(self.hWaitStop)
danWaitForSingleObject
. Didasarkan pada penyalinan dari jawaban yang dipilih di sini mungkin. Ini adalah cara yang baik untuk melakukannya yang bekerja dengan baik untuk kedua argumen "debug" dan "berhenti". (Bagian tentang menggunakan SC tampaknya berlebihan ketikaHandleCommandLine
melakukan pekerjaan, dan dapat menjalankan debug.)pysc: Manajer Kontrol Layanan di Python
Contoh skrip untuk dijalankan sebagai layanan yang diambil dari pythonhosted.org :
sumber
Saya mulai hosting sebagai layanan dengan pywin32 .
Semuanya baik-baik saja tetapi saya menemukan masalah bahwa layanan tidak dapat memulai dalam 30 detik (batas waktu default untuk Windows) pada startup sistem. Itu penting bagi saya karena startup Windows terjadi secara simultan pada beberapa mesin virtual yang dihosting pada satu mesin fisik, dan beban IO sangat besar. Pesan kesalahan adalah:
Error 1053: The service did not respond to the start or control request in a timely fashion.
Error 7009: Timeout (30000 milliseconds) waiting for the <ServiceName> service to connect.
Saya banyak bertengkar dengan pywin, tetapi akhirnya menggunakan NSSM seperti yang diusulkan dalam jawaban ini . Sangat mudah untuk bermigrasi ke sana.
sumber
nssm dalam python 3+
(Saya mengonversi file .py saya ke .exe dengan pyinstaller )
nssm: seperti yang dikatakan sebelumnya
Di konsol NSSM:
path: path \ to \ your \ program.exe Anda
Direktori startup: path \ to \ your \ #sama sebagai path tetapi tanpa program.exe Anda
Argumen: kosong
Jika Anda tidak ingin mengonversi proyek Anda menjadi .exe
python {{your python.py file name}}
sumber
Contoh pywin32 lengkap menggunakan loop atau subthread
Setelah mengerjakan ini dan mematikan selama beberapa hari, di sini adalah jawaban yang saya ingin temukan, menggunakan pywin32 agar tetap bagus dan mandiri.
Ini adalah kode kerja yang lengkap untuk satu solusi berbasis loop dan satu berbasis thread. Ini dapat bekerja pada kedua python 2 dan 3, meskipun saya hanya menguji versi terbaru pada 2.7 dan Win7. Pengulangan harus baik untuk kode polling, dan tapak harus bekerja dengan lebih banyak kode seperti server. Tampaknya bekerja dengan baik dengan server pelayan wsgi yang tidak memiliki cara standar untuk mematikan dengan anggun.
Saya juga ingin mencatat bahwa sepertinya ada banyak contoh di luar sana, seperti ini yang hampir bermanfaat, tetapi pada kenyataannya menyesatkan, karena mereka telah memotong dan menempelkan contoh lain secara membabi buta. Saya bisa saja salah. tetapi mengapa membuat acara jika Anda tidak pernah menunggu untuk itu?
Yang mengatakan saya masih merasa saya berada di tanah yang agak goyah di sini, terutama berkaitan dengan seberapa bersih jalan keluar dari versi utas, tapi setidaknya saya percaya tidak ada yang menyesatkan di sini.
Untuk menjalankan cukup salin kode ke file dan ikuti instruksi.
memperbarui:
Gunakan bendera sederhana untuk mengakhiri utas. Yang penting adalah cetakan "selesai".
Untuk contoh yang lebih rinci keluar dari utas server yang tidak kooperatif, lihat posting saya tentang server wsgi pelayan .
sumber
Jawaban yang diterima menggunakan
win32serviceutil
karya tetapi rumit dan membuat debugging dan perubahan lebih sulit. Hal ini jauh lebih mudah untuk menggunakan NSSM ( Non-Menyedot Service Manager) . Anda menulis dan debug nyaman program python normal dan ketika akhirnya berhasil Anda menggunakan NSSM untuk menginstalnya sebagai layanan dalam waktu kurang dari satu menit:Dari command prompt yang ditinggikan (admin) Anda menjalankan
nssm.exe install NameOfYourService
dan Anda mengisi opsi-opsi ini:C:\Python27\Python.exe
)c:\path\to\program.py
)Omong-omong, jika program Anda mencetak pesan berguna yang ingin Anda simpan di file log, NSSM juga dapat menangani ini dan banyak lagi untuk Anda.
sumber
Bagi siapa saja yang ingin membuat layanan di VENV atau Pycharm !!!!!!!
Setelah membaca semua jawaban dan buat beberapa skrip, jika Anda dapat menjalankan
python service.py install
danpython service.py debug
, tetapipython service.py start
tidak memiliki respons.Mungkin itu disebabkan oleh masalah venv, karena layanan windows memulai layanan Anda dengan exec
PROJECT\venv\Lib\site-packages\win32\pythonservice.exe
.Anda dapat menggunakan
powershell
ataucmd
untuk menguji layanan Anda untuk menemukan lebih banyak detail kesalahan.Jika Anda mendapatkan kesalahan seperti saya, maka Anda dapat memeriksa jawaban saya di pertanyaan lain, saya memperbaikinya dan memposting kode saya di sini .
sumber
https://www.chrisumbel.com/article/windows_services_in_python
Tindak lanjuti PySvc.py
mengganti folder dll
Saya tahu ini sudah tua tapi saya terjebak di ini selamanya. Bagi saya, masalah khusus ini diselesaikan dengan menyalin file ini - pywintypes36.dll
Dari -> Python36 \ Lib \ situs-paket \ pywin32_system32
Ke -> Python36 \ Lib \ situs-paket \ win32
cd C:\Users\user\AppData\Local\Programs\Python\Python38-32
NET START PySvc
NET STOP PySvc
sumber