вывод кортежа python print() после компиляции CPython в .so

Python print() будет печатать свои аргументы как кортеж только после того, как этот .py будет скомпилирован CPython в .so и импортирован. Как он может вести себя как обычный файл py?

Сценарии примерно такие. Вот функция output(), определенная в mod4.py:

def output(a, b):
    print(a, b, str(a)+str(b))

Я использую следующие main.py для вызова output():

import mod4
mod4.output(2, 3)

вывод будет таким:

2 3 23

Затем я компилирую mod4.py с помощью CPython, редактируя setup.py, например:

from distutils.core import setup
from Cython.Build import cythonize

setup(name="mod4.app", ext_modules=cythonize("mod4.py"))

и выполните python setup.up build_ext --inplace в командной строке, что, в свою очередь, сгенерирует mod4.cpython-37m-darwin.so. Тогда main.py будет выводиться как:

(2, 3, '23')

это похоже на кортеж аргументов print().

Версия питона 3.7.4,

$ python --version
Python 3.7.4

Как я могу получить output() в выводах .so так же, как в .py?


person Cuteufo    schedule 01.12.2019    source источник
comment
Я предполагаю, что скомпилированная версия основана на python2.   -  person quamrana    schedule 01.12.2019
comment
Обычно я использую python 3.7.4 в своей среде. Как конкретно указать, какая версия используется скомпилированной версией?   -  person Cuteufo    schedule 01.12.2019
comment
Ну, что за командная строка, которая выдает ваш .so? Конечно, опция —version скажет вам.   -  person quamrana    schedule 01.12.2019
comment
Я отредактировал OP с подробностями компиляции версии .so и python. Спасибо!   -  person Cuteufo    schedule 01.12.2019
comment
Вам необходимо предоставить уровень языка 3 для cythonize, в противном случае предполагается синтаксис python2. При компиляции должно быть предупреждение о том, что   -  person ead    schedule 02.12.2019


Ответы (1)


спасибо за совет, @quamrana и @ead. С вашими подсказками и ссылкой на Как указать Python 3 source в Cython setup.py?, я отредактировал setup.py следующим образом (добавил language_level="3" в вызове cythonize()):

from distutils.core import setup
from Cython.Build import cythonize

setup(name="mod4.app", ext_modules=cythonize("mod4.py", language_level="3"))

и результат становится тем, что я ожидаю.

person Cuteufo    schedule 02.12.2019