Excel - VBA

Local Web Server 간단하게 실행하고 종료하기 (feat. Python)

EGTools 2024. 6. 16. 01:41

Naver의 Dynamic Map API를 사용해 보려고 준비중인데,

예제를 실행하려고 로컬 Web Server를 만드려니 귀찮아서 

Python을 이용하여 서버를 구동하고 샘플을 웹브라우저에서 확인하고

끝나면 다시 Python을 종료하는 일을 반복하다 보니...

매크로로 자동으로 서버를 백그라운드에서 구동시키고, 

사용이 완료되면 다시 종료시키는 것을 구성하였습니다.

 

1. Python으로 HTTP Server 구동

  - 먼저 웹페이지 파일이 있는 폴더로 이동한 다음에
  - 간단하게 CMD 창을 띄워서 아래 코드를 입력하면 됩니다.

  - 사용할 Port는 귀찮아서 80으로 사용하는데, 8080처럼 다른 Port를 지정해도 됩니다.

python -m http.server 80

서버가 실행된 화면

 

  - Web Browser에서  localhost를 입력하면 아래와 같이 http.server를 구동한 폴더에서 시작합니다.

    index.html이 있으면 바로 로딩해서 보여주고, 없다면 아래처럼 폴더 내용을 보여줍니다.

 

 

2. Python을 종료

  - CMD 창이 그대로 있을 때에는 그 창에서 Ctrl+C를 눌르면 창이 사라지면서 종료 됩니다.

 

3. 백그라운드에서 실행중인 Python 종료

  - tasklist 명령으로 이미지 이름과 PID를 확인하고

  - taskkill 명령으로 해당 PID를 종료합니다.

 

 

4. VBA로 백그라운드에서 서버 실행

  -  Home으로 사용할 폴더를 사용자가 지정하도록 하고

  - 해당 드라이브, 폴더로 이동한다음

  - Shell의 Run 명령어로 창이 보이지 않도록 실행합니다.

Sub StartLocalServerWithPython()
    Dim wShell As Object, FolderPath As String
    Set wShell = CreateObject("WScript.Shell")
    With Application.FileDialog(msoFileDialogFolderPicker)
        .AllowMultiSelect = False
        .InitialFileName = Environ("UserProfile")
        .Show
        If .SelectedItems.Count = 0 Then Exit Sub
        FolderPath = .SelectedItems.Item(1)
    End With
    ChDrive FolderPath
    ChDir FolderPath
    wShell.Run "python -m http.server 80", 0
End Sub

 

 

5. VBA로 백그라운드에서 구동중인 서버 종료

  - 창이 없으므로 Ctrl+C로 할 수 없으므로

  - Python이 실행되는 Process ID를 확인하여

  - taskkill 명령으로 종료시킵니다.

Sub StopLocalServerWithPython()
    Dim wShell As Object, oProcs As Object, oPrc As Object
    Set wShell = CreateObject("WScript.Shell")
    Set oProcs = GetObject("winmgmts:\\.\root\CIMV2").ExecQuery("SELECT Name, ProcessID FROM Win32_Process")
    For Each oPrc In oProcs
        If UCase(Left(oPrc.Properties_("Name").Value, 6)) Like "PYTHON" Then
            Debug.Print oPrc.Properties_("Name").Value, oPrc.Properties_("ProcessID").Value
            wShell.Run "taskkill /PID " & oPrc.Properties_("ProcessID").Value, 0
            Exit For
        End If
    Next oPrc
End Sub