दिलचस्प पोस्ट
IE8 के लिए सीमा त्रिज्या सरल कस्टम लॉगिंग चौखटे के साथ सूत्रों के माध्यम से जावा एफएक्स टेक्स्टएरिया के लिए संदेश लॉग करने का सबसे कारगर तरीका उसी स्क्रिप्ट के साथ जमा करें एचटीएमएल फार्म से PHP के साथ ईमेल भेजें NetBeans से टॉमकेट शुरू करने में त्रुटि – '127.0.0.1 *' को आंतरिक या बाहरी कमान के रूप में मान्यता नहीं दी गई है पीथोनपाथ बनाम sys.path मैं नोडा समय से आईएएनए / ओल्सन समय क्षेत्रों की सूची कैसे पॉप्युलेट करूँ? एंड्रॉइड स्टूडियो में डिबग.कीस्टोर कहां है जावास्क्रिप्ट: दो सरणियों को एक सरणी में जोड़ने के लिए कैसे जुड़ें / संयोजन करें? XPath और XSLT 2.0 .NET के लिए? सीएसएस गुण: प्रदर्शन बनाम दृश्यता स्ट्रट्स टैग में #,% और $ के बीच अंतर क्या है? एसक्यूएल क्वेरी – यूनियन में आदेश का उपयोग करना <Ui: include>, टैग फ़ाइलें, संमिश्र घटकों और / या कस्टम घटकों का उपयोग कब करना है? आप वैकल्पिक 2.0 ओएस 3.0 सुविधाओं को 2.0 संगत अनुप्रयोग में कैसे उपयोग करते हैं? कोणीय के लिए $ $ (डबल डॉलर का चिह्न) क्या उपयोग किया जाता है?

अजगर में डिफ़ॉल्ट अनुप्रयोग के साथ दस्तावेज़ खोलें

मुझे विंडोज और मैक ओएस में अपने डिफॉल्ट एप्लीकेशन का इस्तेमाल करते हुए एक दस्तावेज़ खोलने में सक्षम होना चाहिए। असल में, मैं ऐसा ही करना चाहता हूं, जब आप एक्सप्लोरर या फाइंडर में दस्तावेज़ आइकन पर डबल क्लिक करेंगे। पायथन में यह करने का सबसे अच्छा तरीका क्या है?

वेब के समाधान से एकत्रित समाधान "अजगर में डिफ़ॉल्ट अनुप्रयोग के साथ दस्तावेज़ खोलें"

मैक ओएस में, आप "ओपन" कमांड का उपयोग कर सकते हैं। एक ऐसा विंडोज एपीआई कॉल है जो कुछ समान करता है, लेकिन मुझे इसे याद नहीं है

अद्यतन करें

ठीक है, "start" कमांड ऐसा करेगा, इसलिए यह काम करना चाहिए।

मैक ओएस एक्स:

os.system("open "+filename) 

विंडोज:

 os.system("start "+filename) 

बहुत बाद में एडवर्ड द्वारा अद्यतन: ओएससिस्टम कार्य करता है, लेकिन यह केवल उन फ़ाइल नामों के साथ काम करता है, जिनके पास फ़ाइल नाम में फ़ोल्डर्स और फाइलों में कोई रिक्त स्थान नहीं है (जैसे A: \ abc \ def \ a.txt)

बाद में अपडेट करें

ठीक है, स्पष्ट रूप से इस मूर्ख-गधा विवाद जारी है, तो चलो बस सबप्रोसेस के साथ ऐसा करने पर देखें।

open और start क्रम मैक ओएस / एक्स और विंडोज के लिए क्रम दुभाषिया चीजें हैं अब, मान लें कि हम उपप्रोसेस का उपयोग करते हैं Canonically, आप उपयोग करेंगे:

 try: retcode = subprocess.call("open " + filename, shell=True) if retcode < 0: print >>sys.stderr, "Child was terminated by signal", -retcode else: print >>sys.stderr, "Child returned", retcode except OSError, e: print >>sys.stderr, "Execution failed:", e 

अब, इसके फायदे क्या हैं? सिद्धांत रूप में, यह अधिक सुरक्षित है – परन्तु वास्तव में हमें एक कमांड लाइन को एक ही रास्ता या अन्य निष्पादित करने की ज़रूरत है; या तो पर्यावरण में, हमें पर्यावरण और सेवाओं की ज़रूरत होती है ताकि हम पारस्परिक रूप से, पथ प्राप्त कर सकें, और आगे बढ़ सकें। किसी भी मामले में हम मनमाने ढंग से पाठ निष्पादित कर रहे हैं, इसलिए इसमें कोई अंतर्निहित नहीं है "लेकिन आप 'filename ; rm -rf /' " समस्या टाइप कर सकते हैं, और यदि फ़ाइल का नाम दूषित हो सकता है, subprocess.call का उपयोग कर हमें कोई सुरक्षा नहीं देता है ।

यह वास्तव में हमें किसी भी त्रुटि का पता नहीं दे रहा है, हम अभी भी retcode आधार पर किसी भी मामले पर निर्भर हैं। हमें बच्चे की प्रक्रिया के लिए इंतजार करने की आवश्यकता नहीं है, चूंकि हम एक अलग प्रक्रिया शुरू करने की समस्या का बयान ले रहे हैं।

"लेकिन subprocess पसंदीदा है।" हालांकि, os.system() को नापसंद नहीं किया गया है, और यह विशेष कार्य के लिए सबसे सरल उपकरण है।

निष्कर्ष: os.system() का उपयोग करना यह सबसे आसान, सबसे सरल तरीका है, और इसलिए एक सही जवाब है।

पायथन 2.4 + पर उपलब्ध os.system() मॉड्यूल का उपयोग करें, os.system() , इसलिए आपको शेल से बचने के साथ सौदा नहीं करना पड़ता है।

 import subprocess, os if sys.platform.startswith('darwin'): subprocess.call(('open', filepath)) elif os.name == 'nt': os.startfile(filepath) elif os.name == 'posix': subprocess.call(('xdg-open', filepath)) 

डबल कोष्ठक इसलिए होते हैं क्योंकि subprocess.call() अपनी पहली तर्क के रूप में एक अनुक्रम चाहता है, इसलिए हम यहां ट्यूपल का उपयोग कर रहे हैं। जीनोम के साथ लिनक्स सिस्टम पर एक gnome-open कमान भी है जो एक ही काम करता है, लेकिन xdg-open फ्री डेस्कटॉप फाउंडेशन मानक है और लिनक्स डेस्कटॉप वातावरण में काम करता है।

बस पूर्णता के लिए (यह प्रश्न में नहीं था), एक्सडी-ओपन लिनक्स पर ऐसा ही करेगा।

मैं पसंद करता हूं:

 os.startfile(path, 'open') 

ध्यान दें कि यह मॉड्यूल उन फाइलनामों का समर्थन करता है, जिनके पास उनके फ़ोल्डरों और फाइलों में रिक्त स्थान हैं

 A:\abc\folder with spaces\file with-spaces.txt 

( अजगर डॉक्स ) 'खुली' को जोड़ा जाना नहीं है (यह डिफ़ॉल्ट है)। डॉक्स विशेष रूप से उल्लेख करते हैं कि यह विंडोज एक्सप्लोरर में किसी फ़ाइल के आइकन पर डबल-क्लिक करना है।

यह समाधान केवल विंडोज़ है

 import os import subprocess def click_on_file(filename): try: os.startfile(filename): except AttributeError: subprocess.call(['open', filename]) 

यदि आपको एक अनुमानी पद्धति का उपयोग करना है, तो आप webbrowser विचार कर सकते हैं
यह मानक पुस्तकालय है और इसके नाम के बावजूद यह भी फाइल खोलने का प्रयास करेगा:

ध्यान दें कि कुछ प्लेटफार्मों पर, इस फ़ंक्शन का उपयोग करके एक फ़ाइल नाम खोलने की कोशिश कर रहा है, ऑपरेटिंग सिस्टम के संबद्ध प्रोग्राम को काम और शुरू कर सकता है। हालांकि, यह न तो समर्थित है और न ही पोर्टेबल है ( संदर्भ )

मैंने इस कोड की कोशिश की और यह विंडोज 7 और उबंटू नेटी में ठीक काम किया:

 import webbrowser webbrowser.open("path_to_file") 

यह कोड विंडोज एक्सपी प्रोफेशनल में ठीक काम करता है, इंटरनेट एक्सप्लोरर 8 का उपयोग कर।

प्रारंभ लंबे पथ नामों और सफेद रिक्त स्थान का समर्थन नहीं करता। आपको इसे 8.3 संगत पथों में कनवर्ट करना होगा।

 import subprocess import win32api filename = "C:\\Documents and Settings\\user\\Desktop\file.avi" filename_short = win32api.GetShortPathName(filename) subprocess.Popen('start ' + filename_short, shell=True ) 

एपीआई कॉल के साथ काम करने के लिए फ़ाइल मौजूद है।

यदि आप subprocess.call() रास्ते जाना चाहते हैं, तो इसे इस पर दिखना चाहिए Windows:

 import subprocess subprocess.call(('cmd', '/C', 'start', '', FILE_NAME)) 

आप बस का उपयोग नहीं कर सकते:

 subprocess.call(('start', FILE_NAME)) 

क्योंकि start निष्पादन योग्य नहीं है, लेकिन cmd.exe प्रोग्राम की एक कमांड यह काम:

 subprocess.call(('cmd', '/C', 'start', FILE_NAME)) 

लेकिन केवल अगर FILE_NAME में कोई रिक्त स्थान नहीं है।

जबकि subprocess.call विधि ने पैरामीटर को ठीक से उद्धृत किया है, start कमांड में एक अजीब वाक्यविन्यास है, जहां:

 start notes.txt 

इससे कुछ और है:

 start "notes.txt" 

पहली उद्धृत स्ट्रिंग को विंडो का शीर्षक सेट करना चाहिए। इसे रिक्त स्थान के साथ काम करने के लिए, हमें करना होगा:

 start "" "my notes.txt" 

जो शीर्ष पर कोड करता है

मैं बहुत देर से बहुत देर कर रहा हूँ, लेकिन यहां विंडोज़ एपीआई का उपयोग कर एक समाधान है। यह हमेशा संबद्ध एप्लिकेशन को खोलता है।

 import ctypes shell32 = ctypes.windll.shell32 file = 'somedocument.doc' shell32.ShellExecuteA(0,"open",file,0,0,5) 

बहुत सारे जादू स्थिर पहला शून्य वर्तमान कार्यक्रम का एचडब्ल्यूडी है। शून्य हो सकता है अन्य दो शून्य वैकल्पिक पैरामीटर (पैरामीटर और निर्देशिका) हैं। 5 == SW_SHOW, यह निर्दिष्ट करता है कि ऐप कैसे निष्पादित करें। अधिक जानकारी के लिए ShellExecute API दस्तावेज़ पढ़ें।

ओएस स्टार्टफ़ाइल (पथ, 'ओपन') विंडोज़ के तहत अच्छा है क्योंकि जब रिक्त स्थान डायरेक्टरी में मौजूद है, ओएससिस्टम ('आरम्भ', पथ_नाम) ऐप को सही नहीं खोल सकता है और जब आईआईएलएन निर्देशिका में मौजूद है, ओएस। सिस्टम को यूनिकोड को विंडोज में कंसोल के कोडेक में बदलने की जरूरत है I

मैक ओएस पर आप 'ओपन' कॉल कर सकते हैं

 import os os.popen("open myfile.txt") 

यह TextEdit के साथ फ़ाइल खोल सकता है, या इस फ़ाइल प्रकार के लिए जो भी ऐप डिफ़ॉल्ट के रूप में सेट है

यदि आप Mac OS X पर फ़ाइल खोलने के लिए ऐप निर्दिष्ट करना चाहते हैं, तो इसका प्रयोग करें: os.system("open -a [app name] [file name]")

विंडोज 8.1 पर, नीचे काम किया है जबकि अन्य उपायों के साथ subprocess.call पथ में विफल रहता है उसमें रिक्त स्थान है

 subprocess.call('cmd /c start "" "any file path with spaces"') 

इससे पहले और दूसरे के उत्तरों का उपयोग करके, यहां एक इनलाइन कोड है जो कई प्लेटफार्मों पर काम करता है।

 import sys, os, subprocess subprocess.call(('cmd /c start "" "'+ filepath +'"') if os.name is 'nt' else ('open' if sys.platform.startswith('darwin') else 'xdg-open', filepath))