LookupError: pengkodean tidak diketahui: idna - hanya dari subproses.panggilan

Saya mencoba menjalankan skrip python 2.7 dari skrip Iron python menggunakan subprocess.call. proses yang dipanggil menggunakan impor yang tidak didukung di IronPython seperti scikit-learn dan requests.

Saat ini saya mencoba menjalankan skrip python 2.7 menggunakan perintah ini:

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

tapi saya mendapatkan:

LookupError: pengkodean tidak diketahui: idna

sekarang, skrip ini berfungsi dengan baik jika saya menjalankannya dari shell windows, atau dari lingkungan Eclipse pydev. apa perbedaan antara menjalankannya dari shell, dengan menjalankannya dari subprocess.call yang menyebabkannya gagal??

Terima kasih

---EDIT---

Sepertinya saya juga tidak bisa mengimpor codings.idna :

ImportError: Tidak ada modul bernama idna

yang sangat sangat aneh... pencetakan sys.path menunjukkan bahwa c:\\Python27\\Lib ada, dan file idna.py ada di direktori pengkodean... bagaimana mungkin impor tidak berfungsi???

---SATU EDIT LAGI---

Saya telah menemukan satu cara untuk mengatasi masalah ini - memulai skrip IronPython dari shell python - dan semuanya berfungsi dengan baik. Saya masih tidak tahu mengapa menggunakan juru bahasa python 2.7 dari IronPython mengganggu modul internal python 2.7... PYTHONPATH menyertakan jalur ke modul tersebut, jadi saya akan sangat menghargai wawasan apa pun tentang apa yang terjadi di balik terpal.


person WeaselFox    schedule 25.04.2013    source sumber
comment
buat contoh kode minimal lengkap yang menunjukkan masalah dan posting traceback lengkap, misalnya masukkan print u'abc'.encode('idna') ke dalam file child.py dan panggil dari parent.py: import subprocess; subprocess.call([r'c:\Python27\python.exe', 'child.py']). Pertama-tama jalankan parent.py menggunakan CPython (untuk memastikannya berfungsi seperti yang diharapkan) kemudian jalankan parent.py menggunakan IronPython dan lihat apakah itu mereproduksi masalah.   -  person jfs    schedule 25.04.2013
comment
@ J.F.Sebastian - Saya tidak dapat mereproduksi kesalahan seperti yang Anda sarankan. Ini berfungsi dengan baik saat menjalankan parent.py dengan IronPython...   -  person WeaselFox    schedule 26.04.2013
comment
Ini berarti CPython 2.7 menemukan pengkodean idna dengan baik. Apa yang terjadi jika Anda memanggil brainManager_toFile.py dari parent.py, bukan child.py?   -  person jfs    schedule 26.04.2013
comment
hm... berfungsi juga. sepertinya satu-satunya masalah adalah saat menjalankannya dari gerhana. masih tidak yakin kenapa, tapi aku akan membiarkannya pergi.. Terima kasih   -  person WeaselFox    schedule 27.04.2013


Jawaban (1)


IronPython tidak mendukung idna pengkodean yang mungkin digunakan oleh requests modul.

idna pengkodean tersedia sejak Python 2.3:

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

Untuk menghindari ambiguitas tentang python apa yang digunakan untuk menjalankan skrip Anda, coba tentukan jalur ke Python yang dapat dieksekusi secara eksplisit:

from subprocess import STDOUT, check_output as qx

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

Sebagai alternatif, Anda dapat menginstal pylauncher, agar dapat menentukan versi Python yang diinginkan untuk skrip Python di baris shebangnya misalnya, #!python2.7.

person jfs    schedule 25.04.2013
comment
Terimakasih atas tanggapan Anda. Saya telah mencoba menentukan secara eksplisit file yang dapat dieksekusi, tetapi tidak berhasil. Saya tidak mengerti mengapa menjalankan dari IronPython membuat python 2.7 tidak menemukan idna di dalam folder /Lib/encodings-nya.. - person WeaselFox; 25.04.2013