সিস্টেমের হোস্টনেম পেতে আমি কীভাবে পাইথন ব্যবহার করতে পারি?


681

আমি একটি স্থানীয় নেটওয়ার্কের জন্য একটি চ্যাট প্রোগ্রাম লিখছি। আমি কম্পিউটারগুলি সনাক্ত করতে এবং পাইথনের সাথে ব্যবহারকারী-সেট কম্পিউটারের নাম পেতে সক্ষম হতে চাই।

উত্তর:


1043

ব্যবহার socketএবং তার gethostname()কার্যকারিতা। hostnameপাইথন ইন্টারপ্রেটার যে কম্পিউটারটি চালাচ্ছে এটি কম্পিউটারটি পেয়ে যাবে :

import socket
print(socket.gethostname())

70
ঠিক আছে, এটা সঠিক নয়। এটি আমার জন্য অফলাইন এবং বাড়িতে কাজ করে তবে এখন আমি একটি অফিস এবং এটি পৃথক হোস্টের নাম দেয়।
ডেটাগ্রিড

74
এবং মনে রাখবেন যে socket.getfqdn()
এফকিউডিএন-এর

31
@ ডেটাগ্রিড এর কারণ আপনার হোস্টের নাম পরিবর্তন হচ্ছে। পাইথনের সমস্যা নয়।
strickli

4
@ ডাটাগ্রিড ১. আমি মোটামুটি নিশ্চিত যে এটি "এলোমেলো" নয়, যদিও এটি আপনার কাছে সেভাবে প্রদর্শিত হতে পারে। ২. প্রশ্নটি "সিস্টেমের নাম" নয়, "সিস্টেমের হোস্টনাম" বলেছিল। ৩. প্রচুর সংখ্যক সিস্টেমের জন্য (স্বীকৃতভাবে উইন্ডোজ সহ নয়) হোস্ট এবং সিস্টেমের নাম একই।
strickli

8
শুধু কৌতূহল যে সকেট.গথোস্টনাম () এবং ওস.উনাম () [1] বা প্ল্যাটফর্ম.উনাম () [1]
লেটসমজি ২৩:৫২ এ ২১:৫২

388

এই দুটিই বেশ বহনযোগ্য:

import platform
platform.node()

import socket
socket.gethostname()

HOSTবা HOSTNAMEপরিবেশের ভেরিয়েবলগুলি ব্যবহার করে যে কোনও সমাধান পোর্টেবল নয়। এমনকি এটি চালানোর সময় এটি যদি আপনার সিস্টেমে কাজ করে তবে ক্রোন এর মতো বিশেষ পরিবেশে চালানোর সময় এটি কাজ নাও করতে পারে।


6
আচ্ছা, আধা-বহনযোগ্য। কিছু প্ল্যাটফর্মে প্ল্যাটফর্ম.নোড () fqdn দেয় এবং অন্যকে কেবল হোস্টনাম
raindog308

3
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
রাডার নীচে

8
python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
রাডার নীচে

7
@ বেলোথ্যাডার চিন্তিত হবেন না, আমি সাধারণত একবারে স্ক্রিপ্টে একবারেই ফোন করি।
রবার্ট

6
প্ল্যাটফর্ম.নোড () os.getenv এর চেয়েও দ্রুত। জেথোস্টনাম এমনকি কোনও প্রতিযোগী নয়। তবে যদি সময়টি কোনও ফ্যাক্টর না হয়: import os, platform; os.getenv('HOSTNAME', os.getenv('COMPUTERNAME', platform.node())).split('.')[0]ক্রোস প্ল্যাটফর্ম হওয়া উচিত এবং যদি পরিবেশের পরিবর্তনশীল উপস্থিত থাকে তবে তাদের সমর্থন করা উচিত - যা কিছু অতি ব্যবহারকারী পরিস্থিতিতে নিয়ন্ত্রণের অনুমতি দেয়, যেমনHOSTNAME=correct python xyz.py
অরওলোফিল

121

আপনি সম্ভবত ওএস মডিউলটি লোড করবেন, তাই অন্য পরামর্শটি হ'ল:

import os
myhost = os.uname()[1]

8
ব্যবহার করে সমাধানের জন্য +1 osমডিউলটি । পোর্টেবল এবং সত্যই সঠিক নয়, তবে যাইহোক।
MestreLion


9
আপনি এটিকে 3.3+ এ আরও কিছুটা স্পষ্ট করতে ওস.উনাম ()। নদনামও করতে পারেন
হুট

4
নীচের একটি উত্তর অনুরূপ চেহারা দেয় platform.uname()[1]যা উইন্ডোজে কাজ করে।
চমত্কার

6
@ ফ্যান্টাবোলাস আপনার সম্ভবত "নীচে" এর মতো অবস্থানিক শব্দ ব্যবহার করা উচিত নয় কারণ উত্তরগুলি অবতরণের সময় স্থানান্তরিত হতে পারে;)
জোনাথন কোমার

65

কি সম্পর্কে :

import platform

h = platform.uname()[1]

প্রকৃতপক্ষে আপনি সমস্ত ফলাফলটি একবার দেখতে চান platform.uname()


1
আমার জন্য উবুন্টু এবং উইন্ডোতে কাজ করেছেন। ধন্যবাদ! 👍
গলিজেয়ার

61

os.getenv('HOSTNAME')এবং os.environ['HOSTNAME']সবসময় কাজ না। ক্রোন জব এবং ডাব্লুএসডিএলে, HTTP HOSTNAME সেট করা নেই। পরিবর্তে এটি ব্যবহার করুন:

import socket
socket.gethostbyaddr(socket.gethostname())[0]

এটি সর্বদা (উইন্ডোজেও) একটি সম্পূর্ণরূপে যোগ্য হোস্টের নাম দেয়, আপনি / ইত্যাদি / হোস্টগুলিতে একটি সংক্ষিপ্ত নাম নির্ধারণ করলেও ।

আপনি যদি / ইত্যাদি / হোস্টগুলিতে কোনও এলিফ নির্ধারণ করে থাকেন তবে socket.gethostname()উপনামটি ফিরিয়ে দেবে। platform.uname()[1]একই জিনিস।

আমি এমন একটি ক্ষেত্রে দৌড়েছি যেখানে উপরেরগুলি কাজ করে না আমি এখন এটি ব্যবহার করছি:

import socket
if socket.gethostname().find('.')>=0:
    name=socket.gethostname()
else:
    name=socket.gethostbyaddr(socket.gethostname())[0]

এটি প্রথমে গেথোস্টনামটি কল করে এটি দেখার জন্য যে এটি কোনও হোস্ট নামের মতো দেখাচ্ছে এমন কিছু ফেরত দেয় কিনা তা যদি না আমার মূল সমাধানটি ব্যবহার করে।


15
আপনি সম্ভবত চান socket.getfqdn(), যদিও এটি ওপি যা চায় তা নয়
jfs

17

আমি যদি সঠিক হয়ে থাকি তবে আপনি সকেট.জস্টস্টনেম ফাংশনটি সন্ধান করছেন:

>> import socket
>> socket.gethostname()
'terminus'

13

কমপক্ষে অজগর থেকে> = 3.3 :

আপনি ক্ষেত্রটি ব্যবহার করতে পারবেন nodenameএবং অ্যারে সূচকগুলি ব্যবহার এড়াতে পারেন :

os.uname().nodename

যদিও, এমনকি os.uname এর ডকুমেন্টেশন ব্যবহার করার পরামর্শ দেয়socket.gethostname()



5

কিছু সিস্টেমে, হোস্টনামটি পরিবেশে সেট করা থাকে। যদি এটি আপনার ক্ষেত্রে হয় তবে ওএস মডিউলটি এটি os.getenv এর মাধ্যমে পরিবেশের বাইরে নিয়ে যেতে পারে । উদাহরণস্বরূপ, যদি HOSTNAME হ'ল পরিবেশগত পরিবর্তনশীল যা আপনি চান তা অন্তর্ভুক্ত থাকলে, নিম্নলিখিতটি এটি পাবেন:

import os
system_name = os.getenv('HOSTNAME')

আপডেট: মন্তব্যগুলিতে উল্লিখিত হিসাবে, এটি সর্বদা কার্যকর হয় না, কারণ প্রত্যেকের পরিবেশ এইভাবে সেট আপ হয় না। আমি বিশ্বাস করি যে সময় আমি প্রাথমিকভাবে উত্তর দিয়েছিলাম তখনই আমি এই সমাধানটি ব্যবহার করছিলাম কারণ এটি প্রথম কোনও ওয়েব অনুসন্ধানে আমি পেয়েছিলাম এবং এটি আমার জন্য তখন কাজ করেছিল। বহনযোগ্যতার অভাবের কারণে আমি সম্ভবত এটি এখন ব্যবহার করব না। তবে আমি এই উত্তরটি রেফারেন্সের উদ্দেশ্যে রেখে চলেছি। এফডব্লিউআইডাব্লু, আপনার পরিবেশের সিস্টেমের নাম থাকলে এবং আপনি ইতিমধ্যে ওএস মডিউলটি আমদানি করে থাকলে এটি অন্যান্য আমদানির প্রয়োজনীয়তা দূর করে। এটি পরীক্ষা করুন - যদি আপনি যে পরিবেশে আপনার প্রোগ্রামটি পরিচালনা করার প্রত্যাশা করেন এমন সমস্ত পরিবেশে যদি এটি কাজ না করে তবে অন্য যে কোনও সমাধান সরবরাহ করুন।


5
এটি আমার জন্য "কিছুই নয়" ফেরত দেয়। আপনার পোস্ট করা লিঙ্ক অনুসারে, এর অর্থ হল 'HOSTNAME' পরিবর্তনশীলটি বিদ্যমান নেই ...: - /
জন

@ জন: আপনি কি উইন্ডোজে আছেন? এটি আমার জন্য একটি লিনাক্স বাক্সে কাজ করেছিল, তবে আমি উইন্ডোজটিতেও কিছুই পাই না।
গ্রিনম্যাট

@ মুহিয়াএন জোরোজ: আমি মনে করি এটি আপনার বাস্তবায়ন / ইনস্টলেশন নির্ভর করে। আমি যখন উত্তরটি লিখেছিলাম আমি একটি রেড হ্যাট বাক্সে ছিলাম এবং এটি কার্যকর হয়েছিল। এখন আমি উবুন্টুতে আছি এবং এটি কার্যকর হয় না। আমি উত্তরটি পরিবর্তন করেছি।
গ্রিনম্যাট

লেনভো এনএএস-তে কাজ করছেন না, কোনও দিনই ফিরে আসবেন না। এখন আমি আমদানি সকেট মুদ্রণ (সকেট.গথোস্টনাম ()) ব্যবহার করছি
রুই মার্টিনস

@ রুইমার্টিনস: যেমনটি আমি বলেছি, এটি সর্বত্র কাজ করবে বলে মনে হয় না। খুশী হয়ে আপনি এমন কিছু খুঁজে পেয়েছেন যা কাজ করে।
গ্রিনম্যাট

5

আমার পাইলগ কনফ ফাইলটিতে পিসির নাম ব্যবহার করার দরকার ছিল এবং সকেট লাইব্রেরি পাওয়া যায় না, তবে ওএস লাইব্রেরি রয়েছে।

জন্য উইন্ডোজ আমি ব্যবহৃত:

os.getenv('COMPUTERNAME', 'defaultValue')

যেখানে ডিফল্টভ্যালু হ'ল কোনওটি ফেরত দেওয়া রোধ করার একটি স্ট্রিং


12
COMPUTERNAME একটি খুব মাইক্রোসফ্ট শুধুমাত্র পরিবেশের পরিবর্তনশীল এবং এর জন্য বহনযোগ্য নয়।
ডুইট স্পেন্সার

1
হ্যাঁ, তবে এটি এমএস সিস্টেমগুলির জন্য কাজ করে, এবং যদি এটি ফিট করে তবে এটি কাজ করে। ব্যবহারিকতা এবং প্রশ্ন এগুলিকে অপ্রাসঙ্গিক করে দেয় এমন অনেক সময় এখানে লোকেরা গতি বা প্ল্যাটফর্মের স্বাধীনতায় খুব বেশি জড়িয়ে পড়ে।
বিল কিড

7
@ বিলকিড ওপি প্রশ্নে উইন্ডোজ, ওএস এক্স এবং লিনাক্সের উল্লেখ করেছে, সুতরাং সিস্টেমের বহনযোগ্যতার প্রয়োজন খুব যুক্তিসঙ্গত অনুমান।
zstewart

1
@ বিলকিড যদিও সাধারণভাবে এটি সত্য যে আপনার অকালীন অপটিমাইজেশন বা বহনযোগ্যতা এড়ানো উচিত, সহজেই উপলভ্য নয় এবং তাত্ক্ষণিকভাবে আরও রক্ষণাবেক্ষণযোগ্য সমাধান ব্যবহার করা উচিত নয় কারণ এটি আরও বহনযোগ্য।
ম্যাড পদার্থবিজ্ঞানী

2

আপনাকে কোডের এই লাইনটি কার্যকর করতে হবে

sock_name = socket.gethostname()

এবং তারপরে আপনি সংযোজকটিকে সন্ধান করতে নামটি ব্যবহার করতে পারেন:

print(socket.gethostbyname(sock_name))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.