2016-08-27 7 views
15

पावरहेल v5, विंडोज 8.1, पायथन 3 के तहत। ये विफल क्यों होते हैं और कैसे ठीक करें?पायथन के साथ कैसे '[System.Console] :: आउटपुट एन्कोडिंग/इनपुट एन्कोडिंग'?

[system.console]::InputEncoding = [System.Text.Encoding]::UTF8; 
[system.console]::OutputEncoding = [System.Text.Encoding]::UTF8; 
chcp; 
"import sys 
print(sys.stdout.encoding) 
print(sys.stdin.encoding) 
sys.stdout.write(sys.stdin.readline()) 
" | 
sc test.py -Encoding utf8; 
[char]0x0422+[char]0x0415+[char]0x0421+[char]0x0422+"`n" | py -3 test.py 

प्रिंट:

अजगर में पाइपिंग डेटा
Active code page: 65001 
cp65001 
cp1251 
п»ї???? 
+0

हर कार्यक्रम का अपना stdin है/stdout एन्कोडिंग। कोई वैश्विक सिस्टम सेटिंग नहीं है जो किसी अन्य प्रोग्राम की सेटिंग्स को ओवरराइड कर सकती है, इसलिए जो भी आप PowerShell में सेट करते हैं वह केवल PowerShell को प्रभावित करता है। यदि संभव हो, तो अपने पायथन स्टडीन एन्कोडिंग को मैन्युअल रूप से सेट करें। मुझे लगता है कि इसके लिए बहुत सारे उदाहरण होना चाहिए। – wOxxOm

+0

@wOxxOm क्या पाइथन के लिए कुछ सम्मेलन हैं? ऐसा लगता है कि यह सिस्टम सिस्टम से स्टडआउट एन्कोडिंग प्राप्त करता है। लेकिन क्यों नहीं stdin? – Artyom

+0

मेरा मुद्दा यह है कि प्रत्येक कार्यक्रम अपने ही ह्यूरिस्टिक्स और तर्क का उपयोग करता है, इसलिए जो भी आप PowerShell में सेट करते हैं वह stdin के पायथन के हैंडलिंग पर लागू नहीं होता है। खैर, आम तौर पर। पायथन 3 स्मार्ट होने और stdin एन्कोडिंग अनुमान लगाने की कोशिश करता है, लेकिन आप निश्चित रूप से * उस पर भरोसा नहीं कर सकते हैं। जैसा कि मैंने कहा कि उदाहरणों के बहुत सारे होना चाहिए कि पायथन में stdin एन्कोडिंग कैसे सेट करें। – wOxxOm

उत्तर

8

आप कर रहे हैं; उस बिंदु पर पायथन का stdin अब एक TTY (आपका कंसोल) से जुड़ा हुआ नहीं है और यह अनुमान लगाएगा कि एन्कोडिंग क्या हो सकती है। इसके बजाए, डिफ़ॉल्ट सिस्टम लोकेल का उपयोग किया जाता है; आपके सिस्टम पर सीपी 1251 (विंडोज लैटिन -1-आधारित कोडपेज) है।

PYTHONIOENCODING environment variable सेट ओवरराइड करने के लिए:

PYTHONIOENCODING
इस दुभाषिया चलाने से पहले सेट है, तो यह वाक्य रचना encodingname:errorhandler में, stderr stdin/stdout/के लिए प्रयुक्त एन्कोडिंग ओवरराइड करता है। encodingname और :errorhandler दोनों भाग वैकल्पिक हैं और इसका अर्थ str.encode() जैसा ही है।

पावरशेल यूनिक्स शैल के तरीके के अनुसार प्रति-कमांड-लाइन पर्यावरण चर का समर्थन करने के लिए प्रतीत नहीं होता है; सबसे आसान सिर्फ पहला चर सेट करने के लिए है:

Set-Item Env:PYTHONIOENCODING "UTF-8" 

या यहाँ तक कि

Set-Item Env:PYTHONIOENCODING "cp65001" 

ही Windows UTF-8 कोड पृष्ठ पर जाहिरा तौर पर है नहीं काफी UTF-8 वास्तव में, विंडोज संस्करण के आधार पर और गीलेर पर या पाइप पुनर्निर्देशन का उपयोग नहीं किया जाता है।

+0

उत्तर के लिए धन्यवाद।फिर भी यह प्रिंट करता है: "सक्रिय कोड पृष्ठ: 65001 यूटीएफ -8 यूटीएफ -8 ????" – Artyom

+0

@ आर्टिम: क्या आप 'sys.stdout.write (repr (sys.stdin.readline()) के साथ परीक्षण कर सकते हैं) कृपया? इस तरह हम उस रेखा की सामग्री देख सकते हैं और यदि यह पाइथन या पावरहेल चीजों को उलझाना है। –

+0

फिर यह '\ ufeff ???? \ n' है। पाइथन में पाइप किए जाने पर पावरहेल वास्तव में इसे सही ढंग से मुद्रित करता है। यह पावरहेल के तहत पायथन का उपयोग करने में मेरा विश्वास तोड़ रहा है;) – Artyom

2

शक्तियों में सीपीथन क्यों एम्बेड नहीं करें ?! सीपीथन को एम्बेड करना इतना आसान है, और पावरहेल play with .NET and COM objects पर बहुत अच्छा आरपीएल है। PowerShell से pythonnet का उपयोग करने के लिए यहां एक सरल परिचय दिया गया है। ध्यान दें कि एन्कोडिंग स्वचालित रूप से पावरहेल से पायथन तक कैसे प्रचारित होती है।

Windows PowerShell 
Copyright (C) 2015 Microsoft Corporation. All rights reserved. 

PS C:\Users\denfromufa> [system.console]::InputEncoding = [System.Text.Encoding]::UTF8; 
PS C:\Users\denfromufa> [system.console]::OutputEncoding = [System.Text.Encoding]::UTF8; 
PS C:\Users\denfromufa> [Reflection.Assembly]::LoadFile("C:\Python\Miniconda3_64b\Lib\site-packages\Python.Runtime.dll") 


GAC Version  Location 
--- -------  -------- 
False v4.0.30319  C:\Python\Miniconda3_64b\Lib\site-packages\Python.Runtime.dll 


PS C:\Users\denfromufa> $gil = [Python.Runtime.Py]::GIL() 
PS C:\Users\denfromufa> $sys=[Python.Runtime.Py]::Import("sys") 
PS C:\Users\denfromufa> $sys.stdin.encoding.ToString() 
cp65001 
PS C:\Users\denfromufa> $sys.stdout.encoding.ToString() 
cp65001 
PS C:\Users\denfromufa> $gil.Dispose() 
PS C:\Users\denfromufa> [Python.Runtime.PythonEngine]::Shutdown() 
PS C:\Users\denfromufa> 

[संपादित करें]

यहाँ snek पैकेज कि powershell में Python एम्बेड करने के लिए powershell विकासक के द्वारा जारी किया गया था है:

https://github.com/adamdriscoll/snek

+1

मूल्यवान अतिरिक्त! अभी भी सवाल का जवाब नहीं दिया गया है (एक बग की तरह दिखता है)। मुझे आश्चर्य है कि क्या पाइथननेट पाइथन स्क्रिप्ट चलाएगा जो सही ढंग से एन्कोडिंग के साथ काम करेगा। हां, 'stdin' वहाँ एन्कोडिंग सही ढंग से मिला है; तो आशाजनक लग रहा है – Artyom

+1

क्या आप पोस्ट कर सकते हैं अगर प्रश्न में पाइथननेट सही तरीके से प्राप्त होता है और पाइप करता है? – Artyom

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