अजगर का उपयोग करके वास्तविक उपयोगकर्ता होम निर्देशिका कैसे खोजें?


81

मैं देखता हूं कि अगर हम HOME (linux) या USERPROFILE (विंडोज़) पर्यावरण चर को बदलते हैं और एक पायथन स्क्रिप्ट चलाते हैं, तो यह नया मान उपयोगकर्ता के घर के रूप में देता है जब मैंने कोशिश की थी, os.environ ['HOME'] os.exp

क्या पर्यावरण चर पर भरोसा किए बिना वास्तविक उपयोगकर्ता होम निर्देशिका खोजने का कोई तरीका है?

संपादित करें:
यहां रजिस्ट्री में पढ़कर विंडोज़ में यूज़रहोम खोजने का एक तरीका है,
http://mail.python.org/pipermail/python-win32/2008-January/006677.html

संपादित करें:
pywin32 का उपयोग करके घर खोजने का एक तरीका,

from win32com.shell import shell,shellcon
home = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, None, 0)

आप यूनिक्स कमांड (शॉर्टकट) चेकआउट करना चाह सकते हैं: ~userयह आपको वर्तमान उपयोगकर्ता की होम निर्देशिका में ले जाता है। खिड़कियों पर कोई विचार नहीं है।
mAm

यह कैसे पायथन में घर निर्देशिका प्राप्त करने के लिए एक डुप्लिकेट चिह्नित किया जाना चाहिए ? चूँकि उस प्रश्न का स्वीकृत उत्तर पायथन 3 पर काम करता है और यह प्रश्न नहीं करता है।
डोर हाई आर्क

जवाबों:


96

मुझे लगता है कि os.path.expanduser(path)मददगार हो सकता है।

यूनिक्स और विंडोज पर, एक प्रारंभिक घटक के साथ ~ या ~userउस उपयोगकर्ता के घर निर्देशिका द्वारा प्रतिस्थापित के साथ तर्क लौटाएं ।

यूनिक्स पर, प्रारंभिक ~को पर्यावरण चर द्वारा प्रतिस्थापित किया जाता है होम यदि यह सेट है; अन्यथा वर्तमान उपयोगकर्ता के होम डायरेक्टरी को बिल्ट-इन मॉड्यूल के माध्यम से पासवर्ड डायरेक्टरी में देखा जाता है pwdएक प्रारंभिक ~userपासवर्ड निर्देशिका में सीधे देखा जाता है

यदि सेट किया जाता है, तो विंडोज, होम और USERPROFILE का उपयोग किया जाएगा, अन्यथा HOMEPATH और HOMEDRIVE के संयोजन का उपयोग किया जाएगा। ऊपर दिए गए उपयोगकर्ता पथ से अंतिम निर्देशिका घटक को अलग करके एक प्रारंभिक ~userको नियंत्रित किया जाता है

यदि विस्तार विफल हो जाता है या यदि पथ एक टिल्ड से शुरू नहीं होता है, तो मार्ग अपरिवर्तित वापस आ जाता है।

तो आप बस कर सकते हैं:

os.path.expanduser('~user')

3
सही है, लेकिन पर्यावरण चर को प्रश्न में बदलने के साथ-साथ इस पद्धति को "मूर्ख" बना देगा। अब, कोई ऐसा क्यों करना चाहेगा, मैं नहीं कह सकता। :)
जकोब बोर्ग

1
@calmh: हां, मैंने इसे उपयोग करने के लिए बदल दिया है, '~user'जिसे लिनक्स और विंडोज पर काम करना चाहिए (यहां मुझे 100% यकीन नहीं है क्योंकि मेरे पास इसका परीक्षण करने के लिए विंडोज नहीं है;))।
फेलिक्स क्लिंग

1
यह लिनक्स में काम कर रहा है, लेकिन विंडोज़ में नहीं। विंडोज़ में यह केवल "सी: \ दस्तावेज़ और सेटिंग्स" में शामिल हो जाता है।
asdfg

यह "गृह" चर के गलत होने की समस्या को हल नहीं करता है। देखें cadence.com/Community/forums/t/17969.aspx के लिए उदाहरण
endolith

1
@asdfg: यह मेरे लिए सही ढंग से काम करने की तरह लगता है। लेकिन मैंने यह भी सोचा कि यह पहली बार मैंने कोशिश की थी, क्योंकि मैं पहली बार शाब्दिक स्ट्रिंग '~ उपयोगकर्ता' को पारित कर रहा था (जो वास्तव में '~ बॉब' के बजाय कुछ शाब्दिक होना चाहिए) '~' वर्तमान उपयोगकर्ता)।
जॉन कूम्स

17

मुझे लगता os.path.expanduser(path)है कि आपके सवाल का सबसे अच्छा जवाब है, लेकिन एक विकल्प है जो यूनिक्स दुनिया में ध्यान देने योग्य है: pwdपैकेज। जैसे

import os, pwd

pwd.getpwuid(os.getuid()).pw_dir

1
यह तब उपयोगी होता है जब आप उपयोगकर्ता की होम डायरेक्टरी चाहते हैं, लेकिन गृह परिवेश चर गलत तरीके से सेट किया गया है। जैसा कि लेखक ने उल्लेख किया है, यह प्लेटफ़ॉर्म-स्वतंत्र नहीं है, बल्कि यूनिक्स के लिए है, न कि विंडोज के लिए।
user1071847

1
यह होम एनवी वैरिएबल पर निर्भर करने से बेहतर है जो सूडो कॉल के दौरान संरक्षित हो भी सकता है और नहीं भी। उदाहरण के लिए गृह एन.वी. चर को डेबियन 8 में उपयोगकर्ता को लक्षित करने के लिए सेट किया गया है ('sudo' 'sudo -H' के रूप में कार्य करता है) लेकिन Ubuntu 16 में संरक्षित है ('sudo' 'sudo -E' के रूप में कार्य करता है)
Andrei Korostelev

17
from pathlib import *

str(Path.home())

पायथन 3.5 और इसके बाद के संस्करण में काम करता है। एपीआई प्रदान करने वाली Path.home()एक Pathवस्तु लौटाता है जो मुझे बहुत उपयोगी लगती है।


1
आंतरिक रूप से, pathlibअभी भी पर्यावरण चर पर निर्भर करता है, इसलिए यह आपके विशिष्ट प्रश्न का उत्तर नहीं देता है। चूँकि अधिक सामान्य प्रश्नों को सभी डुप्लिकेट के रूप में चिह्नित किया गया था और यहाँ संदर्भित किया गया था, इसलिए यह इस उत्तर के लिए सबसे अच्छी जगह हो सकती है।
जूलियस कुन्ज

pathlib अब पथ हैंडलिंग के लिए मेरी लाइब्रेरी है! .Home () के बारे में नहीं जानते थे। मुझे सभी अच्छाई की समीक्षा करने के लिए डॉक्स को फिर से जारी करना होगा। चीयर्स!
प्लेसीडलश

5

home_folder = os.getenv('HOME')

यह विंडोज और मैक ओएस पर भी काम करना चाहिए, लिनक्स पर अच्छी तरह से काम करता है।


1
कम से कम यह win10 पर काम नहीं करता है coz varible का नाम HOMEPATH है
Reishin

@ रीशिन यह बिल्कुल सच नहीं है, मैंने अभी इसका परीक्षण किया है और यह विंडोज 10 प्रो पर काम करता है। मुझे वास्तव में नहीं लगता कि वे एक पर्यावरण चर के नाम को एक व्हिम पर बदल सकते हैं, इसे उस नाम से खोजने की अपेक्षा करने वाले सॉफ़्टवेयर की मात्रा को देखते हुए।
sm

@sm कृपया यहां पाया जा सकता है कि Technet.microsoft.com/en-us/library/cc749104(v=ws.10).aspx "HOME" वैरिएबल। यदि आपके पास कस्टम चर है, तो इसका मतलब यह नहीं है कि सभी पीपीएल में है। सबसे आम में, जैसे कि मिंगव, साइबरविन, गिट शेल, आदि ... इसे आपके लिए सेट करना। लेकिन अगर आप cmd.exe चलाते हैं, तो आपको आश्चर्य होगा
Reishin

4

विंडोज के लिए;

import os
homepath = os.path.expanduser(os.getenv('USERPROFILE'))

आपको वर्तमान उपयोगकर्ता की होम डाइरेक्टरी को हैंडल करेगा और

filepath = os.path.expanduser(os.getenv('USERPROFILE'))+'\\Documents\\myfile.txt'

आपको नीचे फ़ाइल को संभाल देगा;

C:\Users\urUserName\Documents\myfile.txt

3

वास्तव में, पर्यावरण चर में परिवर्तन इंगित करता है कि घर को बदलना होगा। इसलिए हर कार्यक्रम / लिपि के संदर्भ में नया घर होना चाहिए; परिणाम भी उस व्यक्ति पर निर्भर हैं जिसने इसे बदल दिया। मैं अभी भी साथ रहना होगा home = os.getenv('USERPROFILE') or os.getenv('HOME')

वास्तव में क्या आवश्यक है?


5
सिग्विन को छोड़कर, जिस स्थिति में दोनों को आमतौर पर परिभाषित किया जाता है, और कई बार अलग होता है।
एम्फ़ैटेमाचिन

3

मुझे एहसास है कि यह एक पुराना सवाल है जिसका उत्तर दिया गया है लेकिन मुझे लगा कि मैं अपने दो सेंट जोड़ूंगा। स्वीकृत उत्तर मेरे लिए काम नहीं कर रहा था। मुझे उपयोगकर्ता निर्देशिका खोजने की आवश्यकता थी और मैं चाहता था कि यह बिना और उसके साथ काम करे sudo। लिनक्स में, मेरी उपयोगकर्ता निर्देशिका "/ होम / someuser" है, लेकिन मेरी रूट निर्देशिका "/ रूट /" है। हालांकि, मेरे मैक पर, उपयोगकर्ता निर्देशिका "/ उपयोगकर्ता / someuser" है। यहाँ है कि मैं क्या कर रहा है:

_USERNAME = os.getenv("SUDO_USER") or os.getenv("USER") 
_HOME = os.path.expanduser('~'+_USERNAME)

यह sudoमैक और लिनक्स पर दोनों के साथ और बिना काम करता है ।


मुझे पता है कि आपने मैक और लिनक्स कहा _USERNAMEथा , लेकिन विंडोज पर था None। भविष्य के पाठकों के लिए।
थॉमस फाउन्सेन्कर

pathlib आयात पथ से; Path.home ()। As_posix () # विंडोज में भी काम करता है। Essronailly Spronck की विधि के समान है, यह अधिक प्राकृतिक हो सकता है।
माइक

क्या इसे जोड़ने के लिए विंडोज़ के साथ काम करना एक सुधार होगा or ""?
पास्कलवूटन

0

लिनक्स और अन्य यूनिक्स पर आप हमेशा एक झलक ले सकते हैं /etc/passwd। होम निर्देशिका छठे बृहदान्त्र से अलग क्षेत्र है। हालांकि विंडोज पर पर्यावरण चर की तुलना में बेहतर करने के बारे में कोई विचार नहीं है। इसके लिए एक सिस्टम कॉल होगी, लेकिन अगर यह पायथन से उपलब्ध है, ...


1
लेकिन यह केवल यूनिक्स (लिनक्स) होगा?
रिंग बियरर

1
@ring - हां। उस प्रभाव में पाठ जोड़ा गया।
जैकब बोर्ग

-1

लिनक्स पर उपयोगकर्ता फ़ोल्डर नाम प्राप्त करें (अनुवादित):

from gi.repository import GLib

docs = GLib.get_user_special_dir(GLib.USER_DIRECTORY_DOCUMENTS)
desktop = GLib.get_user_special_dir(GLib.USER_DIRECTORY_DESKTOP)
pics = GLib.get_user_special_dir(GLib.USER_DIRECTORY_PICTURES)
videos = GLib.get_user_special_dir(GLib.USER_DIRECTORY_VIDEOS)
music = GLib.get_user_special_dir(GLib.USER_DIRECTORY_MUSIC)
downloads = GLib.get_user_special_dir(GLib.USER_DIRECTORY_DOWNLOAD)
public = GLib.get_user_special_dir(GLib.USER_DIRECTORY_PUBLIC_SHARE)
templates = GLib.get_user_special_dir(GLib.USER_DIRECTORY_TEMPLATES)

print(docs)
print(desktop)
print(pics)
print(videos)
print(music)
print(downloads)
print(public)
print(templates)

अनुवादित कैसे?
जेरिट

OS भाषा में अनुवादित।
एक्सल श्नाइडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.