Làm thế nào để bạn chạy một kịch bản Python như một dịch vụ trong Windows?


260

Tôi đang phác thảo kiến ​​trúc cho một tập hợp các chương trình chia sẻ các đối tượng liên quan đến nhau được lưu trữ trong cơ sở dữ liệu. Tôi muốn một trong các chương trình hoạt động như một dịch vụ cung cấp giao diện cấp cao hơn cho các hoạt động trên các đối tượng này và các chương trình khác để truy cập các đối tượng thông qua dịch vụ đó.

Tôi hiện đang nhắm đến Python và khung Django là các công nghệ để triển khai dịch vụ đó. Tôi khá chắc chắn rằng tôi tìm cách trình bày chương trình Python trong Linux. Tuy nhiên, đây là một mục đặc tả tùy chọn mà hệ thống nên hỗ trợ Windows. Tôi có ít kinh nghiệm về lập trình Windows và không có chút kinh nghiệm nào với các dịch vụ Windows.

Có thể chạy các chương trình Python như một dịch vụ Windows (tức là chạy tự động mà không cần đăng nhập của người dùng)? Tôi sẽ không nhất thiết phải thực hiện phần này, nhưng tôi cần một ý tưởng sơ bộ về cách nó sẽ được thực hiện để quyết định có nên thiết kế theo các dòng này hay không.

Chỉnh sửa: Cảm ơn tất cả các câu trả lời cho đến nay, chúng khá toàn diện. Tôi muốn biết thêm một điều: Windows nhận thức về dịch vụ của tôi như thế nào? Tôi có thể quản lý nó với các tiện ích Windows gốc không? Tương đương với việc đặt tập lệnh start / stop trong /etc/init.d là gì?


2
Kiểm tra mẫu Windows Service này, nó sử dụng API win32service .
CMS

Câu trả lời:


254

Có bạn có thể. Tôi làm điều đó bằng cách sử dụng các thư viện pythoncom đi kèm với ActivePython hoặc có thể được cài đặt với pywin32 (Python cho các phần mở rộng của Windows).

Đây là bộ xương cơ bản cho một dịch vụ đơn giản:

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket


class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "TestService"
    _svc_display_name_ = "Test Service"

    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))
        self.main()

    def main(self):
        pass

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

Mã của bạn sẽ đi theo main()phương thức, thường là với một loại vòng lặp vô hạn có thể bị gián đoạn bằng cách kiểm tra một cờ mà bạn đã đặt trong SvcStopphương thức


21
Sau khi mã hóa điều này, làm thế nào để tôi bảo Windows chạy nó như một dịch vụ?
Bộ

33
@Kit: chạy tập lệnh của bạn với dòng lệnh từ tham số "install". Sau đó, bạn sẽ có thể thấy ứng dụng của mình trong danh sách Dịch vụ của Windows, nơi bạn có thể khởi động, dừng ứng dụng hoặc đặt ứng dụng bắt đầu tự động
Ricardo Reyes

16
Bạn đề cập đặc biệt đến pythoncom và bạn nhập nó trong mã ví dụ của bạn. Vấn đề là bạn không bao giờ thực sự sử dụng pythoncom ở bất cứ đâu trong mã ví dụ của bạn, bạn chỉ nhập nó. Tại sao cung cấp cho nó đề cập đặc biệt và sau đó không hiển thị việc sử dụng nó?
Nút840

10
Tại sao cho socket.setdefaulttimeout(60)là? Có cần thiết cho một dịch vụ không, hay nó chỉ là bản sao được sao chép từ một số dịch vụ hiện có? :)
Timur

7
chrisumbel.com/article/windows_service_in_python Đây là một ví dụ tương tự nhưng đầy đủ hơn
csprabala

41

Mặc dù tôi đã đưa ra câu trả lời được chọn vài tuần trước, nhưng trong thời gian đó tôi đã đấu tranh rất nhiều với chủ đề này. Cảm giác như có một bản cài đặt Python đặc biệt và sử dụng các mô-đun đặc biệt để chạy tập lệnh vì dịch vụ đơn giản là sai cách. Điều gì về tính di động và như vậy?

Tôi tình cờ thấy Trình quản lý dịch vụ không hút tuyệt vời , điều này khiến việc đối phó với Windows Services trở nên thực sự đơn giản và lành mạnh. Tôi đã hình dung vì tôi có thể chuyển các tùy chọn cho một dịch vụ đã cài đặt, tôi cũng có thể chọn Python thực thi của mình và chuyển tập lệnh của tôi làm tùy chọn.

Tôi chưa thử giải pháp này, nhưng tôi sẽ làm ngay bây giờ và cập nhật bài đăng này trong suốt quá trình. Tôi cũng quan tâm đến việc sử dụng virtualenvs trên Windows, vì vậy tôi có thể đến với một hướng dẫn sớm hay muộn và liên kết với nó ở đây.


Bất kỳ may mắn? Tôi đang xây dựng một trang web rất đơn giản cho một khách hàng và không cần sử dụng toàn bộ ngăn xếp Apache. Ngoài ra, việc tự mình xây dựng dịch vụ nghe có vẻ như là một lời mời cho rắc rối, vì tôi đã đọc từ các bình luận khác.
Jaran

Vâng, điều này hoạt động và nó rất dễ dàng để làm. Bạn chỉ cần đưa ra đường dẫn và đối số cho kịch bản. Tôi đã có thể khiến tôi chạy ra khỏi bàn điều khiển chỉ trong trường hợp ai đó kết thúc với cửa sổ bàn điều khiển bằng cách nào đó.
kmcguire

Mặc dù điều này rõ ràng có hiệu quả, nhưng có những khó khăn khác, đặc biệt là khi bạn "không cần sử dụng toàn bộ ngăn xếp Apache": ví dụ gunicorn chưa chạy trên Windows, đây thực sự là showstopper đối với tôi.
mknaf

4
Bí quyết ở đây là để chạy python.exe như một dịch vụ và kịch bản python của bạn như là tham số: như "NSSM cài đặt MyServiceName c: \ python27 \ python.exe c: \ temp \ myscript.py"
poleguy

Hoạt động tuyệt vời! Trên một hệ thống có nhiều môi trường ảo, đường dẫn có thể tham chiếu exe trình thông dịch Python trong thư mục ScScript của môi trường ảo mong muốn. Có vẻ như new-servicetrong PowerShell có thể thực hiện điều này, nhưng bắt đầu (và giám sát) một tập lệnh như một dịch vụ rõ ràng bao gồm nhiều chi tiết hơn, điều mà nssm chăm sóc rất độc đáo.
Fred Schleifer

26

Cách đơn giản nhất là sử dụng: NSSM - Trình quản lý dịch vụ không hút:

1 - thực hiện tải xuống trên https://nssm.cc/doad

2 - cài đặt chương trình python làm dịch vụ: Giành chiến thắng với tư cách quản trị viên

c:> nssm.exe cài đặt WinService

3 - Trên bảng điều khiển NSSMs:

đường dẫn: C: \ Python27 \ Python27.exe

Thư mục khởi động: C: \ Python27

Đối số: c: \ WinService.py

4 - kiểm tra các dịch vụ đã tạo trên services.msc


Tôi đã từng sử dụng nssm.exe cài đặt Visual Studio C ++ .exe làm dịch vụ và bây giờ tôi có thể sử dụng nssm.exe cho dịch vụ Python .pyc của mình. Cảm ơn.
etoricky

Lưu ý: nếu tập lệnh * .py của bạn nằm trong một thư mục có khoảng trắng (ví dụ: C: \ Program Files \ myapp.py) cần chỉ định đối số trong dấu ngoặc kép: Đối số: "C: \ Chương trình tập tin \ myapp.py"
Yury Kozlov

Làm thế nào để cung cấp một môi trường ảo?
shaik moeed

24

Cách đơn giản nhất để đạt được điều này là sử dụng lệnh gốc sc.exe:

sc create PythonApp binPath= "C:\Python34\Python.exe --C:\tmp\pythonscript.py"

Người giới thiệu:

  1. https://technet.microsoft.com/en-us/l Library / cc990289 (v = ws.11) .aspx
  2. Khi tạo một dịch vụ với sc.exe làm thế nào để vượt qua trong các tham số ngữ cảnh?

Tôi nghĩ, đó là một vấn đề với chính lệnh hoặc ứng dụng của bạn. Dù sao, hãy kiểm tra bộ phận hỗ trợ
này.microsoft.com / en

Ứng dụng của tôi hoạt động tốt bên ngoài dịch vụ và tôi đã sử dụng cùng một mã ở trên mà không có kết quả.
nimeresam

Làm thế nào để cung cấp một môi trường ảo?
shaik moeed

Bạn đã thử virtualenv?
pyOwner

1
Điều này không hoạt động. Dịch vụ Windows phải hiển thị một giao diện nhất định mà gói pywin32 thực hiện. Tuy nhiên, một kịch bản Python cũ đơn giản sẽ không đủ.
Siddhartha Gandhi

23

Có một vài lựa chọn thay thế để cài đặt như một dịch vụ hầu như bất kỳ thực thi Windows nào.

Phương pháp 1: Sử dụng instsrv và srvany từ rktools.exe

Đối với Windows Home Server hoặc Windows Server 2003 (cũng hoạt động với WinXP), Windows Server 2003 Resource Kit Tools đi kèm với các tiện ích có thể được sử dụng song song cho việc này, được gọi là instsrv.exesrvany.exe . Xem bài viết Microsoft KB KB137890 này để biết chi tiết về cách sử dụng các dụng cụ này.

Đối với Windows Home Server, có một trình bao bọc thân thiện với người dùng tuyệt vời cho các tiện ích này có tên là " Any Service Installer ".

Phương pháp 2: Sử dụng ServiceInstaller cho Windows NT

Có một cách khác là sử dụng ServiceInstaller cho Windows NT ( có thể tải xuống tại đây ) với các hướng dẫn python có sẵn . Trái với tên gọi, nó cũng hoạt động với cả Windows 2000 và Windows XP. Dưới đây là một số hướng dẫn về cách cài đặt tập lệnh python như một dịch vụ.

Cài đặt tập lệnh Python

Chạy ServiceInstaller để tạo một dịch vụ mới. (Trong ví dụ này, người ta cho rằng python được cài đặt tại c: \ python25)

Service Name  : PythonTest
Display Name : PythonTest 
Startup : Manual (or whatever you like)
Dependencies : (Leave blank or fill to fit your needs)
Executable : c:\python25\python.exe
Arguments : c:\path_to_your_python_script\test.py
Working Directory : c:\path_to_your_python_script

Sau khi cài đặt, hãy mở applet Services của Control Panel, chọn và khởi động dịch vụ PythonTest.

Sau câu trả lời ban đầu của tôi, tôi nhận thấy có những câu hỏi và trả lời liên quan chặt chẽ đã được đăng trên SO. Xem thêm:

Tôi có thể chạy tập lệnh Python dưới dạng dịch vụ (trong Windows) không? Làm sao?

Làm cách nào để Windows biết về dịch vụ tôi đã viết bằng Python?


Tôi chỉ nhận thấy đã có những câu hỏi và trả lời tương tự khác: stackoverflow.com/questions/32404/ Khăn stackoverflow.com/questions
432328 / trộm

Trình cài đặt dịch vụ không hoạt động trên kiến ​​trúc 64 bit nên tùy chọn 1 trở thành tùy chọn goto.

Liên kết trên đến ServiceInstaller không còn hoạt động. Tôi tìm thấy nó ở đây: sites.google.com.vn/site/conort/
trộm

2
không lưu ý, tôi không nghĩ NTsẽ nhất thiết phải "trái" với tên, ít nhất là không phải trong lời nói của lập trình viên-dân gian. Nó chỉ đề cập đến " kiến trúc NT ", trái ngược với " thương hiệu NT ". Điều đó nói rằng, theo cuộc nói chuyện trên wikipedia, điều này là tranh luận, vì "đó không phải là một thuật ngữ chính thức của Microsoft", nhưng vẫn có một truyền thống với dòng suy nghĩ này.
n611x007

15

Từng bước giải thích làm thế nào để nó hoạt động:

1- Đầu tiên tạo một tập tin python theo bộ xương cơ bản được đề cập ở trên. Và lưu nó vào một đường dẫn, ví dụ: "c: \ PythonFiles \ AppServerSvc.py"

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket


class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "TestService"
    _svc_display_name_ = "Test Service"


    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                          servicemanager.PYS_SERVICE_STARTED,
                          (self._svc_name_,''))
        self.main()

    def main(self):
        # Your business logic or call to any class should be here
        # this time it creates a text.txt and writes Test Service in a daily manner 
        f = open('C:\\test.txt', 'a')
        rc = None
        while rc != win32event.WAIT_OBJECT_0:
            f.write('Test Service  \n')
            f.flush()
            # block for 24*60*60 seconds and wait for a stop event
            # it is used for a one-day loop
            rc = win32event.WaitForSingleObject(self.hWaitStop, 24 * 60 * 60 * 1000)
        f.write('shut down \n')
        f.close()

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

2 - Trên bước này, chúng tôi nên đăng ký dịch vụ của chúng tôi.

Chạy dấu nhắc lệnh với tư cách quản trị viên và gõ như:

sc tạo TestService binpath = "C: \ Python36 \ Python.exe c: \ PythonFiles \ AppServerSvc.py" DisplayName = "TestService" start = auto

đối số đầu tiên của binpathđường dẫn của python.exe

đối số thứ hai của binpathđường dẫn của tệp python của bạn mà chúng ta đã tạo

Đừng bỏ lỡ rằng bạn nên đặt một khoảng trắng sau mỗi dấu " = ".

Sau đó, nếu mọi thứ đều ổn, bạn sẽ thấy

[SC] Tạo dịch vụ THÀNH CÔNG

Bây giờ dịch vụ python của bạn đã được cài đặt như dịch vụ windows ngay bây giờ. Bạn có thể thấy nó trong Trình quản lý dịch vụ và sổ đăng ký trong:

HKEY_LOCAL_MACHINE \ HỆ THỐNG \ CurrentControlset \ Services \ TestService

3- Ok ngay bây giờ. Bạn có thể bắt đầu dịch vụ của mình trên trình quản lý dịch vụ.

Bạn có thể thực thi mọi tệp python cung cấp bộ xương dịch vụ này.


Có rất nhiều ví dụ xấu về cách sử dụng SetEvent(self.hWaitStop)WaitForSingleObject. Dựa trên sự sao chép thiếu suy nghĩ của câu trả lời được chọn ở đây có lẽ. Đây là một cách tốt để làm điều đó hoạt động sạch sẽ cho cả hai "gỡ lỗi" kết thúc các đối số "dừng". (Phần về việc sử dụng SC có vẻ dư thừa khi HandleCommandLinethực hiện công việc và có thể chạy gỡ lỗi.)
Alias_Knagg

3

p chọc trời: Trình quản lý điều khiển dịch vụ trên Python

Kịch bản ví dụ để chạy như một dịch vụ được lấy từ pythonhosted.org :

from xmlrpc.server import SimpleXMLRPCServer

from pysc import event_stop


class TestServer:

    def echo(self, msg):
        return msg


if __name__ == '__main__':
    server = SimpleXMLRPCServer(('127.0.0.1', 9001))

    @event_stop
    def stop():
        server.server_close()

    server.register_instance(TestServer())
    server.serve_forever()

Tạo và bắt đầu dịch vụ

import os
import sys
from xmlrpc.client import ServerProxy

import pysc


if __name__ == '__main__':
    service_name = 'test_xmlrpc_server'
    script_path = os.path.join(
        os.path.dirname(__file__), 'xmlrpc_server.py'
    )
    pysc.create(
        service_name=service_name,
        cmd=[sys.executable, script_path]
    )
    pysc.start(service_name)

    client = ServerProxy('http://127.0.0.1:9001')
    print(client.echo('test scm'))

Dừng và xóa dịch vụ

import pysc

service_name = 'test_xmlrpc_server'

pysc.stop(service_name)
pysc.delete(service_name)
pip install pysc

3
Có ai biết tại sao điều này có một downvote? Có vẻ như một giải pháp tốt đẹp.
Jarrod Chesney

3

Tôi bắt đầu lưu trữ như một dịch vụ với pywin32 .

Mọi thứ đều ổn nhưng tôi đã gặp vấn đề là dịch vụ không thể khởi động trong vòng 30 giây (thời gian chờ mặc định cho Windows) khi khởi động hệ thống. Nó rất quan trọng đối với tôi vì khởi động Windows diễn ra đồng thời trên một số máy ảo được lưu trữ trên một máy vật lý và tải IO rất lớn. Thông báo lỗi là:

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.

Tôi đã chiến đấu rất nhiều với pywin, nhưng cuối cùng đã sử dụng NSSM vì nó đã được đề xuất trong câu trả lời này . Nó rất dễ dàng để di chuyển đến nó.


2

nssm trong python 3+

(Tôi đã chuyển đổi tệp .py của mình sang .exe bằng pyinstaller )

nssm: như đã nói

  • chạy nssm cài đặt {ServiceName}
  • Trên bảng điều khiển NSSM hè:

    đường dẫn: đường dẫn \ đến \ your \ program.exe

    Thư mục khởi động: path \ to \ your \ #same là đường dẫn nhưng không có chương trình của bạn

    Đối số: trống

Nếu bạn không muốn chuyển đổi dự án của mình sang .exe

  • tạo một tập tin .bat với python {{your python.py file name}}
  • và đặt đường dẫn đến tệp .bat

Làm thế nào để cung cấp một môi trường ảo?
shaik moeed

1

Một ví dụ pywin32 hoàn chỉnh sử dụng vòng lặp hoặc subthread

Sau khi thực hiện và tắt nó trong vài ngày, đây là câu trả lời tôi muốn tìm, sử dụng pywin32 để giữ cho nó đẹp và khép kín.

Đây là mã làm việc hoàn chỉnh cho một giải pháp dựa trên vòng lặp và một luồng. Nó có thể hoạt động trên cả python 2 và 3, mặc dù tôi mới chỉ thử nghiệm phiên bản mới nhất trên 2.7 và Win7. Vòng lặp phải tốt cho mã bỏ phiếu và rãnh hoạt động với mã giống máy chủ hơn. Nó dường như hoạt động độc đáo với máy chủ wsgi phục vụ không có cách tiêu chuẩn để tắt một cách duyên dáng.

Tôi cũng muốn lưu ý rằng dường như có vô số ví dụ ngoài kia, như thế này gần như hữu ích, nhưng trong thực tế lại gây hiểu lầm, bởi vì họ đã cắt và dán các ví dụ khác một cách mù quáng. Tôi có thể sai. Nhưng tại sao tạo ra một sự kiện nếu bạn không bao giờ chờ đợi nó?

Điều đó nói rằng tôi vẫn cảm thấy tôi đang ở trên mặt đất hơi run rẩy ở đây, đặc biệt là về cách làm sạch lối ra khỏi phiên bản luồng, nhưng ít nhất tôi tin rằng không có gì sai lệch ở đây.

Để chạy chỉ cần sao chép mã vào một tệp và làm theo hướng dẫn.

cập nhật:

Sử dụng một cờ đơn giản để chấm dứt chủ đề. Điều quan trọng là bản in "hoàn thành".
Đối với một ví dụ phức tạp hơn thoát ra từ một luồng máy chủ không hợp tác, xem bài viết của tôi về máy chủ wsgi phục vụ bàn .

# uncomment mainthread() or mainloop() call below
# run without parameters to see HandleCommandLine options
# install service with "install" and remove with "remove"
# run with "debug" to see print statements
# with "start" and "stop" watch for files to appear
# check Windows EventViever for log messages

import socket
import sys
import threading
import time
from random import randint
from os import path

import servicemanager
import win32event
import win32service
import win32serviceutil
# see http://timgolden.me.uk/pywin32-docs/contents.html for details


def dummytask_once(msg='once'):
    fn = path.join(path.dirname(__file__),
                '%s_%s.txt' % (msg, randint(1, 10000)))
    with open(fn, 'w') as fh:
        print(fn)
        fh.write('')


def dummytask_loop():
    global do_run
    while do_run:
        dummytask_once(msg='loop')
        time.sleep(3)


class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global do_run
        do_run = True
        print('thread start\n')
        dummytask_loop()
        print('thread done\n')

    def exit(self):
        global do_run
        do_run = False


class SMWinservice(win32serviceutil.ServiceFramework):
    _svc_name_ = 'PyWinSvc'
    _svc_display_name_ = 'Python Windows Service'
    _svc_description_ = 'An example of a windows service in Python'

    @classmethod
    def parse_command_line(cls):
        win32serviceutil.HandleCommandLine(cls)

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.stopEvt = win32event.CreateEvent(None, 0, 0, None)  # create generic event
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                            servicemanager.PYS_SERVICE_STOPPED,
                            (self._svc_name_, ''))
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.stopEvt)  # raise event

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                            servicemanager.PYS_SERVICE_STARTED,
                            (self._svc_name_, ''))
        # UNCOMMENT ONE OF THESE
        # self.mainthread()
        # self.mainloop()

    # Wait for stopEvt indefinitely after starting thread.
    def mainthread(self):
        print('main start')
        self.server = MyThread()
        self.server.start()
        print('wait for win32event')
        win32event.WaitForSingleObject(self.stopEvt, win32event.INFINITE)
        self.server.exit()
        print('wait for thread')
        self.server.join()
        print('main done')

    # Wait for stopEvt event in loop.
    def mainloop(self):
        print('loop start')
        rc = None
        while rc != win32event.WAIT_OBJECT_0:
            dummytask_once()
            rc = win32event.WaitForSingleObject(self.stopEvt, 3000)
        print('loop done')


if __name__ == '__main__':
    SMWinservice.parse_command_line()

0

Câu trả lời được chấp nhận sử dụng win32serviceutilcác tác phẩm nhưng phức tạp và làm cho việc gỡ lỗi và thay đổi khó khăn hơn. Nó là xa dễ dàng hơn để sử dụng NSSM ( Service Manager Non-Sucking) . Bạn viết và thoải mái gỡ lỗi một chương trình python bình thường và khi nó hoạt động cuối cùng, bạn sử dụng NSSM để cài đặt nó như một dịch vụ trong chưa đầy một phút:

Từ một dấu nhắc lệnh nâng cao (quản trị viên) bạn chạy nssm.exe install NameOfYourServicevà bạn điền vào các tùy chọn sau:

  • đường dẫn : (đường dẫn đến python.exe, vd C:\Python27\Python.exe)
  • Đối số : (đường dẫn đến tập lệnh python của bạn, vd c:\path\to\program.py)

Nhân tiện, nếu chương trình của bạn in các thông điệp hữu ích mà bạn muốn giữ trong tệp nhật ký NSSM cũng có thể xử lý việc này và nhiều hơn nữa cho bạn.


Vâng, đây là một bản sao câu trả lời của Adriano. Tôi đã đưa ra câu trả lời đó và cố gắng chỉnh sửa nó nhưng sau khi chỉnh sửa tôi đang xem một câu trả lời mới.
ndemou

Làm thế nào để cung cấp môi trường ảo?
shaik moeed

0

Dành cho ai muốn tạo dịch vụ trong VENV hoặc Pycharm !!!!!!!

Sau khi đọc tất cả các anwsers và tạo một số tập lệnh, nếu bạn có thể chạy python service.py installpython service.py debug, nhưng python service.py startkhông có phản hồi.

Có thể đó là do sự cố venv, vì dịch vụ windows khởi động dịch vụ của bạn bằng cách thực thi PROJECT\venv\Lib\site-packages\win32\pythonservice.exe.

Bạn có thể sử dụng powershellhoặc cmdđể kiểm tra dịch vụ của mình để tìm thêm chi tiết lỗi.

PS C:\Users\oraant> E:

PS E:\> cd \Software\PythonService\venv\Lib\site-packages\win32

PS E:\Software\PythonService\venv\Lib\site-packages\win32> .\pythonservice.exe -debug ttttt
Debugging service ttttt - press Ctrl+C to stop.
Error 0xC0000004 - Python could not import the service's module

Traceback (most recent call last):
  File "E:\Software\PythonService\my_service.py", line 2, in <module>
    import win32serviceutil
ModuleNotFoundError: No module named 'win32serviceutil'

(null): (null)

Nếu bạn gặp một số lỗi như tôi, thì bạn có thể kiểm tra câu trả lời của tôi trong một câu hỏi khác, tôi đã sửa nó và gửi mã của tôi ở đây .


-1

https://www.chrisumbel.com/article/windows_service_in_python

  1. Theo dõi PySvc.py

  2. thay đổi thư mục dll

Tôi biết điều này là cũ nhưng tôi đã bị mắc kẹt trên này mãi mãi. Đối với tôi, vấn đề cụ thể này đã được giải quyết bằng cách sao chép tệp này - pywintypes36.dll

Từ -> Python36 \ Lib \ site-gói \ pywin32_system32

Tới -> Python36 \ Lib \ site-gói \ win32

setx /M PATH "%PATH%;C:\Users\user\AppData\Local\Programs\Python\Python38-32;C:\Users\user\AppData\Local\Programs\Python\Python38-32\Scripts;C:\Users\user\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\pywin32_system32;C:\Users\user\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\win32
  1. thay đổi đường dẫn đến thư mục python bằng cách

cd C:\Users\user\AppData\Local\Programs\Python\Python38-32

  1. NET START PySvc
  2. NET STOP PySvc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.