Ошибки Python на Jython?

#python #migration #jython

#python #миграция #jython

Вопрос:

Я начинаю процесс миграции с python на jython. Кто-нибудь делал это с легкостью раньше? В чем подводные камни? Должен ли я сначала создавать внутри Jython IDE, а затем развертывать или что?

Ответ №1:

Имейте в виду, что в jython, при работе под Java, все имеет «большой конец», независимо от того, на какой платформе вы работаете, тогда как на платформе PC / Linux / Mac (x86) python имеет небольшой конец. Убедитесь, что при использовании struct.pack и struct.unpack вы используете соответствующий префикс

без префикса

запись данных (enessw.py )

 import struct 
f = file('tmp.dat', 'wb') # binary 
f.write(struct.pack('IIII', 1,2,3,4)) # default endianess
  

чтение данных (enessr.py )

 import struct
f = file('tmp.dat', 'rb')
data = f.read()
ints = struct.unpack('IIII', data) # default endianess
print repr(ints)
  

Результаты

Пишите на python, читайте на jython

 C:Documents and Settingsmat99856My Documentstmp>python enessw.py

C:Documents and Settingsmat99856My Documentstmp>python enessr.py
(1, 2, 3, 4)

C:Documents and Settingsmat99856My Documentstmp>jython enessr.py
(16777216L, 33554432L, 50331648L, 67108864L)
  

Запись с помощью jython чтение с помощью python

 C:Documents and Settingsmat99856My Documentstmp>jython enessw.py

C:Documents and Settingsmat99856My Documentstmp>jython enessr.py
(1L, 2L, 3L, 4L)

C:Documents and Settingsmat99856My Documentstmp>python enessr.py
(16777216, 33554432, 50331648, 67108864)
  

Исправление

Используйте < в строке формата для упаковки и распаковки. Это даст указание упаковать / распаковать данные в формате, который должен быть в конце строки.

С ‘<IIII’ в качестве формата упаковки / распаковки

 C:Documents and Settingsmat99856My Documentstmp>python enessw.py

C:Documents and Settingsmat99856My Documentstmp>python enessr.py
(1, 2, 3, 4)

C:Documents and Settingsmat99856My Documentstmp>jython enessr.py
(1L, 2L, 3L, 4L)

C:Documents and Settingsmat99856My Documentstmp>jython enessw.py

C:Documents and Settingsmat99856My Documentstmp>jython enessr.py
(1L, 2L, 3L, 4L)

C:Documents and Settingsmat99856My Documentstmp>python enessw.py

C:Documents and Settingsmat99856My Documentstmp>python enessr.py
(1, 2, 3, 4)

C:Documents and Settingsmat99856My Documentstmp>jython enessr.py
(1L, 2L, 3L, 4L)
  

Ссылки

struct.pack

Ответ №2:

Основная проблема заключается в том, что в Jython нет ни одного из стандартных или сторонних библиотечных модулей, которые используют C в качестве своей реализации. Или C скомпилировал вспомогательные модули. Их довольно много, и они могут возникнуть неожиданным образом.

Кроме того, Jython работает намного медленнее.

Это действительно зависит от того, что вы переносите, и насколько это зависит от сторонних модулей и сколько «чистого» Python он использует.

Я ожидал бы, однако, много проблем с такой миграцией. Большинство Jython, которые я знаю, написаны с нуля, чтобы делать определенные вещи с классом Java, в основном для тестирования.