LookupError: การเข้ารหัสที่ไม่รู้จัก: idna - จาก subprocess.call เท่านั้น

ฉันกำลังพยายามเรียกใช้สคริปต์ python 2.7 จาก Iron python โดยใช้ subprocess.call กระบวนการที่เรียกใช้ใช้การนำเข้าที่ไม่รองรับใน IronPython เช่น scikit-learn และ requests

ขณะนี้ฉันกำลังพยายามเรียกใช้สคริปต์ python 2.7 โดยใช้คำสั่งนี้:

sub_ret_val = subprocess.call("C:/Documents and Settings/avishay/workspace/BursaProject_V1_31/brainManager_toFile.py", shell = True, stderr = subprocess.STDOUT)

แต่ฉันได้รับ:

LookupError: การเข้ารหัสที่ไม่รู้จัก: idna

ตอนนี้สคริปต์นี้ทำงานได้ดีหากฉันรันจากเชลล์ windows หรือจากสภาพแวดล้อม eclipse pydev อะไรคือความแตกต่างระหว่างการรันจากเชลล์กับการรันจาก subprocess.call ทำให้มันล้มเหลว?

ขอบคุณ

---แก้ไข---

ดูเหมือนว่าฉันไม่สามารถนำเข้า encodings.idna ได้เช่นกัน:

ImportError: ไม่มีโมดูลชื่อ idna

ซึ่งแปลกมาก... การพิมพ์ sys.path แสดงว่า c:\\Python27\\Lib อยู่ที่นั่น และไฟล์ idna.py อยู่ในไดเร็กทอรีการเข้ารหัส ... การนำเข้าไม่ทำงานได้อย่างไร ???

---แก้ไขเพิ่มเติมครับ---

ฉันพบวิธีหนึ่งในการแก้ไขปัญหาแล้ว - การเริ่มสคริปต์ IronPython จากเชลล์หลาม - และทุกอย่างทำงานได้ดี ฉันยังไม่มีความคิดว่าทำไมการเรียกใช้ล่าม python 2.7 จาก IronPython จึงรบกวนโมดูลภายในของ python 2.7 ... PYTHONPATH รวมเส้นทางไปยังโมดูลเหล่านั้นด้วย ดังนั้นฉันจะซาบซึ้งอย่างยิ่งกับข้อมูลเชิงลึกเกี่ยวกับสิ่งที่เกิดขึ้นภายใต้ประทุน


person WeaselFox    schedule 25.04.2013    source แหล่งที่มา
comment
สร้างตัวอย่างโค้ดขั้นต่ำที่สมบูรณ์ที่แสดงปัญหาและโพสต์การติดตามย้อนกลับแบบเต็ม เช่น ใส่ print u'abc'.encode('idna') ลงในไฟล์ child.py แล้วเรียกจาก parent.py: import subprocess; subprocess.call([r'c:\Python27\python.exe', 'child.py']) ขั้นแรกให้รัน parent.py โดยใช้ CPython (เพื่อให้แน่ใจว่าทำงานได้ตามที่คาดไว้) จากนั้นรัน parent.py โดยใช้ IronPython และดูว่าจะทำให้เกิดปัญหาอีกครั้งหรือไม่   -  person jfs    schedule 25.04.2013
comment
@ J.F.Sebastian - ฉันไม่สามารถสร้างข้อผิดพลาดซ้ำตามที่คุณแนะนำได้ มันทำงานได้ดีเมื่อรัน parent.py ด้วย IronPython...   -  person WeaselFox    schedule 26.04.2013
comment
หมายความว่า CPython 2.7 ค้นหาการเข้ารหัส idna ได้ดี จะเกิดอะไรขึ้นหากคุณเรียก brainManager_toFile.py จาก parent.py แทนที่จะเป็น child.py   -  person jfs    schedule 26.04.2013
comment
อืม... ก็ใช้ได้เช่นกัน ดูเหมือนว่าปัญหาเดียวคือเมื่อรันจาก eclipse ยังไม่แน่ใจว่าทำไม แต่ฉันจะปล่อยมันไป .. ขอบคุณ   -  person WeaselFox    schedule 27.04.2013


คำตอบ (1)


IronPython ไม่รองรับการเข้ารหัส idna ที่น่าจะเป็น ใช้โดย requests โมดูล

idna การเข้ารหัสมีให้ใช้งานตั้งแต่ Python 2.3:

>>> u"яндекс.рф".encode('idna')
b'xn--d1acpjx3f.xn--p1ai'
>>> b'xn--d1acpjx3f.xn--p1ai'.decode('idna')
'яндекс.рф'

เพื่อหลีกเลี่ยงความคลุมเครือเกี่ยวกับสิ่งที่หลามใช้ในการรันสคริปต์ของคุณ ให้ลองระบุเส้นทางไปยังไฟล์ปฏิบัติการหลามอย่างชัดเจน:

from subprocess import STDOUT, check_output as qx

output = qx([r"c:\Python27\python.exe", r"c:\path\to\script.py"], stderr=STDOUT)

อีกทางเลือกหนึ่ง คุณสามารถติดตั้ง pylauncher เพื่อให้สามารถระบุเวอร์ชัน Python ที่ต้องการสำหรับสคริปต์ Python ในบรรทัด shebang เช่น #!python2.7

person jfs    schedule 25.04.2013
comment
ขอบคุณสำหรับการตอบกลับของคุณ ฉันได้พยายามระบุไฟล์ปฏิบัติการอย่างชัดเจน แต่ก็ไม่มีประโยชน์ ฉันไม่เห็นว่าทำไมการเรียกใช้จาก IronPython จึงควรทำให้ python 2.7 ไม่พบ idna ภายในโฟลเดอร์ /Lib/encodings - person WeaselFox; 25.04.2013