Câu trả lời:
Sử dụng socket
và gethostname()
chức năng của nó . Điều này sẽ nhận được hostname
máy tính nơi trình thông dịch Python đang chạy:
import socket
print(socket.gethostname())
socket.getfqdn()
Cả hai đều khá di động:
import platform
platform.node()
import socket
socket.gethostname()
Bất kỳ giải pháp sử dụng các biến môi trường HOST
hoặc HOSTNAME
không phải là di động. Ngay cả khi nó hoạt động trên hệ thống của bạn khi bạn chạy nó, nó có thể không hoạt động khi chạy trong các môi trường đặc biệt như cron.
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
import os, platform; os.getenv('HOSTNAME', os.getenv('COMPUTERNAME', platform.node())).split('.')[0]
nên biến cross-platform và môi trường hỗ trợ nếu chúng tồn tại - mà cho phép một số điều khiển người dùng trong tình huống cấp thiết, ví dụ nhưHOSTNAME=correct python xyz.py
Bạn có thể sẽ tải mô-đun os, vì vậy một đề xuất khác sẽ là:
import os
myhost = os.uname()[1]
os
mô-đun. Không di động và không thực sự chính xác, nhưng dù sao cũng tiện dụng.
platform.uname()[1]
, DOES hoạt động trên Windows.
Thế còn :
import platform
h = platform.uname()[1]
Trên thực tế bạn có thể muốn có một cái nhìn cho tất cả các kết quả trong platform.uname()
os.getenv('HOSTNAME')
và os.environ['HOSTNAME']
không phải lúc nào cũng làm việc. Trong các công việc định kỳ và WSDL, HTTP HOSTNAME không được đặt. Sử dụng cái này thay thế:
import socket
socket.gethostbyaddr(socket.gethostname())[0]
Nó luôn luôn (ngay cả trên Windows) trả về một tên máy chủ đủ điều kiện, ngay cả khi bạn đã xác định một bí danh ngắn trong / etc / hosts .
Nếu bạn đã xác định một bí danh trong / etc / hosts thì socket.gethostname()
sẽ trả về bí danh. platform.uname()[1]
làm điều tương tự
Tôi gặp phải trường hợp trên không hoạt động. Đây là những gì tôi đang sử dụng bây giờ:
import socket
if socket.gethostname().find('.')>=0:
name=socket.gethostname()
else:
name=socket.gethostbyaddr(socket.gethostname())[0]
Đầu tiên, nó gọi gethostname để xem nếu nó trả về một cái gì đó trông giống như tên máy chủ, nếu không nó sử dụng giải pháp ban đầu của tôi.
socket.getfqdn()
, mặc dù đó không phải là những gì OP yêu cầu
Từ ít nhất trăn> = 3,3 :
Bạn có thể sử dụng trường nodename
và tránh sử dụng lập chỉ mục mảng:
os.uname().nodename
Mặc dù, ngay cả tài liệu của os.uname cũng đề xuất sử dụngsocket.gethostname()
Trên một số hệ thống, tên máy chủ được đặt trong môi trường. Nếu đó là trường hợp của bạn, mô-đun os có thể kéo nó ra khỏi môi trường thông qua os.getenv . Ví dụ: nếu HOSTNAME là biến môi trường chứa những gì bạn muốn, thì sau đây sẽ có được nó:
import os
system_name = os.getenv('HOSTNAME')
Cập nhật: Như đã lưu ý trong các nhận xét, điều này không phải lúc nào cũng hoạt động, vì không phải môi trường của mọi người đều được thiết lập theo cách này. Tôi tin rằng tại thời điểm ban đầu tôi trả lời điều này, tôi đã sử dụng giải pháp này vì đó là điều đầu tiên tôi tìm thấy trong một tìm kiếm trên web và nó hoạt động với tôi vào thời điểm đó. Do thiếu tính di động, có lẽ tôi sẽ không sử dụng nó ngay bây giờ. Tuy nhiên, tôi để lại câu trả lời này cho mục đích tham khảo. FWIW, nó sẽ loại bỏ nhu cầu nhập khác nếu môi trường của bạn có tên hệ thống và bạn đã nhập mô-đun os. Kiểm tra nó - nếu nó không hoạt động trong tất cả các môi trường mà bạn mong đợi chương trình của mình hoạt động, hãy sử dụng một trong những giải pháp khác được cung cấp.
Tôi cần tên của PC để sử dụng trong tệp conf PyLog của tôi và thư viện socket không khả dụng, nhưng thư viện os thì có.
Đối với Windows tôi đã sử dụng:
os.getenv('COMPUTERNAME', 'defaultValue')
Trong đó defaultValue là một chuỗi để ngăn Không trả lại
Bạn phải thực thi dòng mã này
sock_name = socket.gethostname()
Và sau đó bạn có thể sử dụng tên để tìm addr:
print(socket.gethostbyname(sock_name))