2009-04-28 29 views
56

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 tập lệnh 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ấy tên của cửa sổ máy tính chạy kịch bản python?

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

Hãy nói rằng kịch bản được chạy trên một máy tính có tên TỐI-TOWER, tôi muốn viết một cái gì đó như thế này:

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

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

Trả lời

104

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

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

Trả lời một câu hỏi của riêng mình có thể bị coi là kém bởi một số người, nhưng nó hoàn toàn ổn, theo câu hỏi thường gặp: http://stackoverflow.com/faq – Stephan202

+7

Tôi không nghĩ rằng nó xấu cả, vì Eric đã biên soạn một vài câu hỏi các câu trả lời khác nhau thành một tài nguyên duy nhất, chưa kể đến việc thêm một tài nguyên mới (nền tảng). – nilamo

+3

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? –

2

Tôi đặt cược gethostname sẽ hoạt động tốt đẹp.

+0

Promit từ GameDev? Cảm ơn câu trả lời :) –

+1

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

5

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 các API Win32 GetComputerName hoặc GetComputerNameEx

Bạn có thể lấy tên đầy đủ DNS, hoặc tên NETBIOS, hoặc một loạt các thứ khác nhau.

import win32api 
win32api.GetComputerName() 

>>'MYNAME' 

Hoặc:

import win32api 
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname) 

>> u'MYNAME' 
11
+3

Cảm ơn mọi người vì câu trả lời của bạn. 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. –

+3

Điều này không hoạt động đối với tôi trên OS-X 10.6.8 bằng Python 2.7.2, nó trả về Không. Các phương pháp khác được mô tả làm việc tuy nhiên. –

+1

@PeterGibson Tôi đã có cùng một điều xảy ra với tôi trên Ubuntu 12.04. –

18
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

4

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 lại với 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 patform chéo để chắc chắn;)

+0

Chỉ cần một chút bụi: nếu n1 n2 == hoặc == n3 n2: trở n1 elif n2 == n3: trở n2 khác: tăng Exception ("tên máy tính là không bình đẳng với nhau") –

+1

@CharlesPlager Nó phải là: 'if n1 == n2 hoặc n1 == n3: return n1 elif n2 == n3: return n2 else: tăng ngoại lệ (" Tên máy tính không bằng nhau ")' ('n1' thay vì 'n2') – dexteritas

+0

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

Các vấn đề liên quan