Tôi đang cố gắng sử dụng http.server
để kiểm tra tất cả các liên kết trong một dự án Python. Tôi có thể nhận được kịch bản của tôi để làm việc nếu tôi khởi động máy chủ trước khi chạy kịch bản của tôi, và sau đó máy chủ dừng lại khi tôi đóng cửa sổ đầu cuối. Nhưng tôi thực sự thích bản thân kịch bản để bắt đầu và dừng máy chủ.Làm thế nào để giết SimpleHTTPServer từ bên trong một tập lệnh Python?
Tôi đã thực hiện một tập lệnh thử nghiệm để chỉ cần khởi động máy chủ, nhận một trang và chứng minh máy chủ đang chạy, sau đó dừng máy chủ. Tôi dường như không nhận được pid của máy chủ. Khi tôi cố gắng để diệt các pid rằng kịch bản này báo cáo sau khi kịch bản chạy, tôi nhận được một thông báo rằng không có quá trình như vậy; nhưng máy chủ vẫn đang chạy.
Làm cách nào để nhận đúng pid cho máy chủ hoặc nói chung là làm cách nào để dừng máy chủ khỏi tập lệnh?
import os
import requests
from time import sleep
# Start server, in background.
print("Starting server...")
os.system('python -m http.server &')
# Make sure server has a chance to start before making request.
sleep(1)
print "Server pid: "
os.system('echo $$')
url = 'http://localhost:8000/index.html'
print("Testing request: ", url)
r = requests.get(url)
print("Status code: ", r.status_code)
Bạn có thể sử dụng 'subprocess.Popen' thay vì' os .system', nó cung cấp rất nhiều chức năng bổ sung bao gồm cả việc chấm dứt tiến trình con sinh ra. Hoặc bạn chỉ có thể 'nhập SimpleHTTPServer' và sử dụng nó trực tiếp trong kịch bản của bạn ... – l4mpi
Điều đó rất hữu ích, nhưng bạn có phiền hơn một chút không? Các tài liệu tham khảo duy nhất tôi dường như tìm về việc sử dụng SimpleHTTPServer nói về việc sử dụng nó từ dòng lệnh; Tôi không chắc chắn làm thế nào để dừng lại và bắt đầu máy chủ từ bên trong một kịch bản python. Tôi cũng chưa bao giờ sử dụng các quy trình trước đây, vì vậy tôi không hoàn toàn chắc chắn cách khởi động tiến trình con của máy chủ, và sau đó dừng nó lại. Chủ động googling ... – japhyr
Tài liệu ['subprocess'] (http://docs.python.org/2/library/subprocess.html) có tất cả thông tin bạn cần, xem các phần về hàm tạo' Popen' và sử dụng Đối tượng 'Popen' - bạn có thể làm một cái gì đó như' server = Popen (["python", "-m", "SimpleHTTPServer"]) 'và sau đó sử dụng' server.terminate() 'hoặc' server.kill() 'để kết thúc quá trình. Để bắt đầu một 'SimpleHTTPServer' trong một kịch bản, chỉ cần nhìn vào' if __name__ == "__main __": 'block trong SimpleHTTPServer.py - chỉ giữ một tham chiếu đến cá thể BaseServer và đóng nó (nó là một lớp con TCPServer, vì vậy các tài liệu TCPServer sẽ giúp). – l4mpi