2012-03-30 8 views
5

मेरे पास एक यूनिकोड फ़ाइल नाम है जिसे मैं खोलना चाहता हूं। निम्नलिखित कोड:subprocess.Picen एक यूनिकोड पथ

cmd = u'cmd /c "C:\\Pok\xe9mon.mp3"' 
cmd = cmd.encode('utf-8') 
subprocess.Popen(cmd) 

रिटर्न

>>> 'C:\Pokיmon.mp3' is not recognized as an internal or external command, operable program or batch file. 

भले ही फ़ाइल मौजूद नहीं है। ये क्यों हो रहा है?

+0

मुझे लगता है कि 'cmd' किसी और चीज़ के लिए खड़ा है? – brice

+0

मैंने डबल कोट्स को हटा दिया, भले ही वे इस प्रश्न से संबंधित न हों। – iTayb

+0

क्या आपने पाथ पर्यावरण परिवर्तक के लिए पाइथन पथ शामिल किया है? मान लीजिए कि आपके पायथन इंस्टॉलेशन सी में है: \ Python25, आपका नया पथ चर होना चाहिए: % पाथ%; सी: \ पायथन 25 –

उत्तर

10

ऐसा लगता है कि आप विंडोज और पायथन 2.X का उपयोग कर रहे हैं। os.startfile का उपयोग करें:

>>> import os 
>>> os.startfile(u'Pokémon.mp3') 

गैर सहज, एक ही बात करने के लिए आदेश खोल रही है:

>>> import subprocess 
>>> import locale 
>>> subprocess.Popen(u'Pokémon.mp3'.encode(locale.getpreferredencoding()),shell=True) 

अपने सिस्टम पर, आदेश खोल (cmd.exe) एन्कोडिंग cp437 है, लेकिन के लिए विंडोज प्रोग्राम cp1252 है। Popencp1252 के रूप में एन्कोड किए गए शेल कमांड चाहता था। यह एक बग की तरह लगता है, और यह भी पाइथन 3.X:

>>> import subprocess 
>>> subprocess.Popen('Pokémon.mp3',shell=True) 
+0

धन्यवाद! मुझे नहीं पता था 'os.startfile'। – iTayb

+0

विंडोज़ पर पायथन 2 पर,' पॉपन (u'Pokémon.mp3'.encode (एन्कोडिंग)) 'iff' popen (u'Pokémon.mp3'.encode ('mbcs')) 'काम करता है यानी, इसे 'cp1252' के साथ सफल होना चाहिए और इसे आपके मामले में' cp437' के साथ विफल होना चाहिए। क्या 'shell = True' इसे बदलता है?' sys.getfilesystemencoding() 'और 'locale.getpreferredencoding()' के लिए मान क्या हैं? आम तौर पर, 'यू "'' '' 'एमबीसीएस' का उपयोग करके अप्रतिबंधित हो सकता है। पायथन 3 यूनिकोड एपीआई का सीधे उपयोग करता है। – jfs

+0

पायथन 2 पर विंडोज़ पर, यदि आप यूनिकोड कमांड लाइन (पायथन 3 के रूप में) का उपयोग करना चाहते हैं, तो आप [इस वर्कअराउंड] का उपयोग कर सकते हैं (http://vaab.blog.kal.fr/2017/03/16/fixing- विन्डोज़ -पीथॉन-2-7-यूनिकोड-इश्यू-सब-प्रोसेसिस-पॉपन /) ''ctypes'' को पैच' 'subprocess.Popen (..)' ''। – vaab

-2

मुझे लगता है कि विंडोज 16-बिट वर्णों का उपयोग करता है, यह सुनिश्चित नहीं है कि यह यूसीएस 2 या यूटीएफ 16 या ऐसा कुछ है। तो मुझे लगता है कि इसे यूटीएफ 8 के साथ कोई समस्या हो सकती है।

+0

'utf-16' रिटर्न के रूप में सेटिंग 'TypeError: बिना शून्य बाइट्स या कोई भी स्ट्रिंग होना चाहिए, str नहीं 'तो मुझे लगता है कि यह गलत है। – iTayb

2

आपकी समस्या smart_str Django मॉड्यूल के फ़ंक्शन के माध्यम से हल की जा सकती है।

उपयोग इस कोड:

from django.utils.encoding import smart_str, smart_unicode 
cmd = u'cmd /c "C:\\Pok\xe9mon.mp3"' 
smart_cmd = smart_str(cmd) 
subprocess.Popen(smart_cmd) 

आप कैसे विंडोज here पर Django स्थापित करने के लिए के बारे में जानकारी पा सकते हैं। आप पहली बार pip स्थापित और फिर आप व्यवस्थापक विशेषाधिकारों के साथ एक कमांड खोल शुरू करने से Django स्थापित कर सकते हैं और यह आदेश चला सकते हैं:

pip install Django 

यह आपके अजगर स्थापना की साइट-संकुल निर्देशिका में Django स्थापित हो जाएगा।

+0

मैं यूनिकोड को सही ढंग से एन्कोड करने के लिए बस एक नया नया ढांचा स्थापित नहीं करूंगा। फिक्स एक या दो लाइन लंबी होनी चाहिए, 1000+ जटिल कोड नहीं। – iTayb

+0

ठीक है, क्षमा करें, मैंने अपना जवाब अपडेट कर दिया है।शायद यह अब और अधिक सहायक है। –

+0

सबसे पहले, 'लैटिन -1' एन्कोडिंग यूनिकोड नहीं है। यह सभी यूनिकोड मामलों के साथ काम नहीं करेगा। दूसरा, यह अभी भी काम नहीं करता है। यह अपने आप का प्रयास करें। – iTayb

0
>>> subprocess.call(['start', u'avión.mp3'.encode('latin1')], shell=True) 
0 

cmd कॉल करने के लिए यदि आप एक संबद्ध कार्यक्रम शुरू करने के लिए shell पैरामीटर सही तरीके से उपयोग कोई ज़रूरत नहीं है का उपयोग है cmd के start निर्मित AFAIK।

मेरा 2 सी, HIH।

+0

साइड नोट के लिए धन्यवाद, लेकिन यह अभी भी यूनिकोड समस्या को ठीक नहीं करता है। यह आपके सिस्टम पर काम करता है क्योंकि आपके लोकेल एमबीसीएस में char है। यह कोड उन कंप्यूटरों पर काम नहीं करेगा जिनके पास हेब्रे या जापानी उनकी लोकेल भाषा है। – iTayb

संबंधित मुद्दे