Câu hỏi Bắt tên của cửa sổ máy tính chạy kịch bản python?


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

Làm thế nào tôi sẽ nhận được tên máy tính đó trong kịch bản python?

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

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

Có thư viện tiêu chuẩn hoặc bên thứ ba mà tôi có thể sử dụng không?


63
2018-04-28 20:49


gốc




Các câu trả lời:


Nó chỉ ra có ba lựa chọn (bao gồm cả hai lựa 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'

114
2018-04-28 20:57



Trả lời câu hỏi của riêng mình có thể được coi là kém hương vị của một số người, nhưng nó là hoàn toàn tốt, theo các câu hỏi thường gặp: stackoverflow.com/faq - Stephan202
Tôi không nghĩ rằng nó là xấu cả, kể từ khi Eric đã được biên soạn một vài phản ứng khác nhau vào một tài nguyên duy nhất, chưa kể đến việc thêm một cái mới (nền tảng). - nilamo
ok, do đó, điều này kêu lên cho một theo dõi: sự khác biệt giữa platform.node () và socket.gethostname () là gì? họ có thể khác nhau không? - Jason S
Trên hệ thống posix, socket.gethostname() trả về libc gethostname(), trong khi platform.node() trả về platform.uname()[1] có liên quan đến os.uname() gọi là libc uname()... Có vẻ như họ có thể kết thúc ở cùng một nơi, nhưng họ có những con đường khá khác nhau để đến đó và tôi sẽ không dựa vào giá trị giống nhau trên các nền tảng khác nhau. - Peter Gibson
Đáng chú ý là os.environ['COMPUTERNAME'] sẽ trả về tất cả chữ hoa, trong khi platform.node() và socket.gethostname() có thể trả lại trường hợp hỗn hợp. - MrNoob


import socket
socket.gethostname()

22
2018-04-28 20:53



1 cho đâ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


Từ https://mail.python.org/pipermail/python-list/2006-April/397494.html

import os
os.getenv('COMPUTERNAME')

13
2018-04-28 20:53



Cảm ơn tất cả mọi người vì câu trả lời. Tất cả đều làm việc tốt, vì vậy tôi đã chọn người có xếp hạng thấp nhất. - Eric Palakovich Carr
Điều này không làm việc cho tôi trên OS-X 10.6.8 bằng Python 2.7.2, nó trả về None. Các phương pháp khác được mô tả làm việc tuy nhiên. - Peter Gibson
@PeterGibson Tôi đã có cùng một điều xảy ra với tôi trên Ubuntu 12.04. - Daniel F
@EricPalakovichCarr, tôi khuyên bạn nên xóa câu trả lời này là câu trả lời được chấp nhận do không hoạt động trên một số nền tảng. - Peter Gibson
Tốt bắt, guys. Tôi đã đánh dấu tôi là câu trả lời ngay bây giờ. - Eric Palakovich Carr


Như Eric 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ó khi phát triển các ứng dụng biểu mẫu chéo để chắc chắn;)


7
2018-01-13 17:29



Chỉ cần dọn dẹp một chút: nếu n1 == n2 hoặc n2 == n3: trả về n1 elif n2 == n3: trả lại n2 else: tăng ngoại lệ ("Tên máy tính không bằng nhau") - Charles Plager
@CharlesPlager Nó phải 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") (n1 thay vì n2) - dexteritas
@dexteritas: Bạn là chính xác. (Nó sẽ không cho phép tôi chỉnh sửa nó vì bất kỳ lý do gì). - Charles Plager


Kể từ khi scrips python là để chắc chắn chạy trên một hệ thống cửa sổ, bạn nên sử dụng API Win32 GetComputerName hoặc là GetComputerNameEx

Bạn có thể nhận được 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'

6
2018-04-28 20:52





Tôi cá là gethostname sẽ hoạt động tốt đẹp.


3
2018-04-28 20:51



Lời hứa từ GameDev? Cảm ơn câu trả lời :) - Eric Palakovich Carr
Rất giống nhau. Tôi có đủ câu trả lời từ SO mà tôi nghĩ tôi nên đóng góp. - Promit