Bắt tên máy tính windows đang chạy tập lệnh python?


94

Về cơ bản, tôi có một vài máy tính Windows trên mạng của mình sẽ chạy một tập lệnh python. Một tập hợp các tùy chọn cấu hình khác sẽ được sử dụng trong tập lệnh tùy thuộc vào máy tính nào đang chạy tập lệnh này.

Làm cách nào để lấy tên máy tính đó trong tập lệnh python?

Giả sử tập lệnh đang chạy trên máy tính có tên DARK-TOWER, tôi muốn viết một cái gì đó như sau:

>>> python.library.get_computer_name()
'DARK-TOWER'

Tôi có thể sử dụng thư viện chuẩn hoặc thư viện của bên thứ ba không?

Câu trả lời:


160

Hóa ra có ba tùy chọn (bao gồm cả hai tùy chọn đã được trả lời trước đó):

>>> import platform
>>> import socket
>>> import os
>>> platform.node()
'DARK-TOWER'
>>> socket.gethostname()
'DARK-TOWER'
>>> os.environ['COMPUTERNAME']
'DARK-TOWER'

16
Câu hỏi của riêng trả lời của một người có thể được coi là hương vị kém bởi một số người, nhưng nó là hoàn toàn tốt đẹp, theo các câu hỏi thường gặp: stackoverflow.com/faq
Stephan202

9
Tôi không nghĩ điều đó tệ chút nào, vì Eric đã tổng hợp một số phản hồi khác nhau vào một tài nguyên duy nhất, chưa kể đến việc thêm một (nền tảng) mới.
nilamo

4
ok, vì vậy điều này kêu gọi một phần tiếp theo: sự khác biệt giữa platform.node () và socket.gethostname () là gì? chúng có thể khác nhau bao giờ?
Jason S

4
Trên hệ thống posix, socket.gethostname()trả về libc gethostname(), trong khi platform.node()trả về platform.uname()[1]có phần liên quan đến os.uname()nó gọi libc uname()... Có vẻ như chúng có thể kết thúc ở cùng một nơi, nhưng chúng đi theo những con đường khá khác nhau để đến đó và tôi sẽ không dựa vào về giá trị giống nhau trên các nền tảng khác nhau.
Peter Gibson

5
Cần lưu ý rằng os.environ['COMPUTERNAME']sẽ trả về tất cả chữ hoa, ngược lại platform.node()socket.gethostname()có thể trả về trường hợp hỗn hợp.
MrNoob 14/07/17

33
import socket
socket.gethostname()

1
+1 vì đây là cách tốt nhất để đi. Đó là cuộc gọi đa nền tảng hiệu quả nhất.
joshin4colours

20

5
Điều này không hoạt động đối với tôi trên OS-X 10.6.8 sử dụng Python 2.7.2, nó trả về Không có. Tuy nhiên, các phương pháp khác được mô tả hoạt động.
Peter Gibson

2
@PeterGibson Tôi đã gặp điều tương tự xảy ra với tôi trên Ubuntu 12.04.
Daniel F

Trả lại Nonecho tôi trên Ubuntu 16.04. Thật thú vị, HOSTNAMElà một biến môi trường được xác định trong bash, nhưng cả hai cũng os.getenv('HOSTNAME')trả về None, trong khi socket.gethostname()trả về chuỗi chính xác.
Matt Hancock

12

Như Eric Palakovich Carr đã nói bạn có thể sử dụng ba biến thể này.

Tôi thích sử dụng chúng cùng nhau:

def getpcname():
    n1 = platform.node()
    n2 = socket.gethostname()
    n3 = os.environ["COMPUTERNAME"]
    if n1 == n2 == n3:
        return n1
    elif n1 == n2:
        return n1
    elif n1 == n3:
        return n1
    elif n2 == n3:
        return n2
    else:
        raise Exception("Computernames are not equal to each other")

Tôi thích nó hơn khi phát triển các ứng dụng biểu mẫu chéo để chắc chắn;)


1
Chỉ cần một chút bụi: nếu n1 n2 == hoặc n2 == n3: trở về n1 n2 elif == n3: trở về n2 khác: tăng Exception ( "tên máy tính được không bằng với nhau")
Charles Plager

2
@CharlesPlager Nó nên là: if n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")( n1thay vì n2)
dexteritas

@dexteritas: Bạn nói đúng. (Nó sẽ không cho phép tôi chỉnh sửa nó vì bất cứ lý do gì).
Charles Plager

6

Vì các tập lệnh python chắc chắn chạy trên hệ thống windows, bạn nên sử dụng Win32 API GetComputerName hoặc GetComputerNameEx

Bạn có thể lấy tên DNS đủ điều kiện, hoặc tên NETBIOS hoặc nhiều thứ khác nhau.

import win32api
win32api.GetComputerName()

>>'MYNAME'

Hoặc là:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'


0
import socket
pc = socket.gethostname()
print pc

6
Hãy luôn thêm một số giải thích cho câu trả lời.
DaFois

Bên cạnh đó, câu trả lời này chỉ là một bản sao của một 10-tuổi khác cao upvoted câu trả lời .
wovano
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.