LINUX.ORG.RU

4
Всего сообщений: 30

libboost-python 2.7 -> 3.x Видимость модулей созданных в си-коде

Есть некий проект, использующиий libboost-python, который в си++-рантайме создает питоновский модуль, и потом запускает питоновский скрипт который этот модуль импортирует и использует. Сделано это было на питоне 2.7. Случился принудительный переход на питон 3.* и мне так и не удалось заставить это работать в новых условиях.

Может быть кто-то более опытный в ембеденье питона может подсказать как правильно сделать.

Как было (упрощенный вариант):

test_module.py

import _hello_provider

test_var = 42

def hello_static():
        return "Hello world static"

def hello_provided():
        return _hello_provider.provide_hello()

test27.cpp

#include <boost/python.hpp>
 
std::string provide_hello() {
    return "hello world provided";
}
 
BOOST_PYTHON_MODULE(_hello_provider) {
    using namespace boost::python;
    def("provide_hello", &provide_hello);
}


int main()
{
  Py_InitializeEx(0);
  try {
    boost::python::object modImp = boost::python::import("imp");
    init_hello_provider();


    PyImport_AddModule("test_module");

    modImp.attr("load_source")("test_module", "test_module.py");

    boost::python::exec("print(test_var)", boost::python::import("test_module").attr("__dict__"));
    boost::python::exec("print(hello_static())", boost::python::import("test_module").attr("__dict__"));
    boost::python::exec("print(hello_provided())", boost::python::import("test_module").attr("__dict__"));
  }
  catch (const boost::python::error_already_set&)
  {
    PyErr_Print();
  }


  Py_Finalize();
}

На Debian Stretch собираем так:

g++  test27.cpp  -I /usr/include/x86_64-linux-gnu/python2.7 -I /usr/include/python2.7 -lboost_python -lboost_system -lpython2.7

Все работает последний вывод через питоновский модуль дергает си++ную функцию из добавленного в рантайме модуля _hello_provider.

А вот когда я пытаюсь сделать это по аналогии на современном дебиане:

#include <boost/python.hpp>
 
std::string provide_hello() {
    return "hello world provided";
}

BOOST_PYTHON_MODULE(_hello_provider) {
    using namespace boost::python;
    def("provide_hello", &provide_hello);
}


int main()
{
  Py_InitializeEx(0);
  try {
    boost::python::object modImp = boost::python::import("imp");
    PyInit__hello_provider();

    PyImport_AddModule("test_module");

    modImp.attr("load_source")("test_module", "test_module.py");

    boost::python::exec("print(test_var)", boost::python::import("test_module").attr("__dict__"));
    boost::python::exec("print(hello_static())", boost::python::import("test_module").attr("__dict__"));
    boost::python::exec("print(hello_provided())", boost::python::import("test_module").attr("__dict__"));
  }
  catch (const boost::python::error_already_set&)
  {
    PyErr_Print();
  }


  Py_Finalize();
}

С тем же самым питоновским файлом, собирая все на, Debian Bullseye командой

g++ test3x.cpp  -I /usr/include/x86_64-linux-gnu/python3.9 -I /usr/include/python3.9 -lpython3.9  -lboost_python39 -lboost_system

То все собирается, но при запуске ругается:

Traceback (most recent call last):
  File "/usr/lib/python3.9/imp.py", line 169, in load_source
    module = _exec(spec, sys.modules[name])
  File "<frozen importlib._bootstrap>", line 613, in _exec
  File "<frozen importlib._bootstrap_external>", line 790, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "test_module.py", line 1, in <module>
    import _hello_provider
ModuleNotFoundError: No module named '_hello_provider'

Т.е. в таком исполнении оно модуль _hello_provider не видит, и моей квалификации не хватает для того чтобы понять как это сделать чтобы да. Есть кто-то более опытный способный подсказать?

 , ,

shaplov ()

Ansible и проблема Python 2 => Python3

Привет!

Вопросы по сабжу.

  • насколько проблема актуальна для Ansible?
  • Какой процент модулей поддерживает третий Питон?

Или будет достаточно установки в инвентаре

ansible_python_interpreter=/usr/bin/python3

?

 , , ,

Twissel ()

Gentoo: как патчить в зависимости от python_target?

Доброй ночи.
Есть такая приблуда - pyrex. По дефолту оно python2_7 only. Это нечто для компиза.
Хочу попытаться перевести 0.8.8 на пых3_7 и эта либа самая низовая.
Сам pyrex я долго патчил на искоренение пых2_7 синтаксиса и вроде оно собирается с патчем под пых3_7.
И тут вопрос, если я выставлю все пых-таргеты (python2_7 python3_{6,7,8,9}) или только 2_7 и 3_7, то как мне в ебилде применить патч для pyrex-билда только для 3 ветки (то есть через src_prepare чтоле)?
При этом, чтобы собиралось для всех указанных таргетов??

 ,

KosmiK ()

Что-нибудь слышно про Jython 3 или IronPython 3?

Господа, может кто использует эти проекты?

Никто не в курсе как там у них идет разработка 3 ветки Python? Насколько активно, будет ли релиз в ближайшие пару лет?

А то Python 2 уже подмер кажется окончательно, а они до сих пор со своих официальных сайтов предлагают реализации второй ветки.

 , , , ,

EXL ()

Конец эпохи

После очередного обновления дефолта на дефолт, была замечена ликвидация python27. Еще 10 лет разработки из чьих-то жизней ушли в никуда.

Перемещено alpha из screenshots

 , ,

Lucky ()

Никулин, Вицин, Моргунов

Правильно ли?

{ Циник Хохотун и Шептун } = {вицин,моргунов,никулин}.reverse()

 ,

pacify ()

Что делать если pip не устанавливает пакеты

Здравствуйте,я хотел установить модули для python'а но pip выдает ошибки,как востановить работоспособность pip?

 , , ,

cretin00 ()

psycopg2 работа с БД удаление таблицы

Прошу помощи начал разбираться с БД, пытаюсь удалить таблицу из БД ‘‘‘def delete_bd (bddel): con = None bddel = bddel try: con = psycopg2.connect(user=‘postgres’, host=‘127.0.0.1’, password=‘1’) cursor = con.cursor() cursor.execute(«SELECT datname FROM pg_database WHERE " + «datistemplate = false;») fetch = cursor.fetchall() dblist = [fetch[i][0] for i in range(len(fetch))] print(‘wwww’, dblist) cursor.execute(«DROP TABLE %s;» % bddel») except psycopg2.DatabaseError as e: print("ErrorZZ ", e) con.close() bddel = ‘w5’ delete_bd(bddel)’’’

При этом fetchall() все видит: wwww ‘postgres’, ‘s1’, ‘w2’, ‘w4’, ‘w3’, ‘w5’, ‘w6’ но выдает ошибку: ErrorZZ table “w5” does not exist Вроде простая задача - не могу разобраться где ошибка. СПС

 

LavA ()

Сортировка папок в двухмерный списке на Python

Не могу от сортировать папки в двухмерный список писал на python3.

Как сделать мне чтобы результат был такой [['/home/python2', '/home/test_py'], ['test']] но не такой [['/home/python2', '/home/test_py', '/home/test'], []]

вот код.

dp = '/home/'
a='/test'

l = [[] for i in range(2)]

for r,d,f in os.walk(dp):
  if r == a:
    l[1].append(r)
  elif r != True:
     l[0].append(r)
           
print(l)

Примерный код нормально работает.
d='test1', 'test2', 'test3', 'test4'
f='/test1'

s=[[] for i in range(2)]

for i in d:
   if i in f:
     s[1].append(i)
   elif i != True:
     s[0].append(i)

print(s)

Просим помощи у ПИТОНИСТОВ  зарание всем спасибо.

 

roma9 ()

Как быстро преобразовать скрипт?

1. Заменить все

print что-то
на
print( что-то )

2. Заменить все

"стринг с %, {, }" % какие-то данные
на
"стринг с %, {, }".format( какие-то данные )

Всё правильно? Ничего не напутал? Что-нибудь пропустил?

Ответ: Простые случаи вроде print ловит скрипт 2to3, поставляемый с Питоном. Ещё нужно проверить все возвращаемые типы (в первую очередь, bytes вместо string), для чего покрыть весь код тестами.

На всякий случай вот эти скрипты, чтобы опять не искать:

#/usr/bin/python3
import base64
import hashlib
import sys

password, salt = sys.argv[1:3]
hashstr = hashlib.sha1( (password + salt).encode('ascii') ).hexdigest()
res = '{SSHA}' + base64.b64encode( (hashstr + salt).encode('ascii') ).decode('ascii')
print( res )
'''
--------------------------------------------------------------------------------------
'''
#/usr/bin/python3
import base64
import hashlib
import sys

inputt, password = sys.argv[1:3]
if inputt[:6] == '{SSHA}':
    inputt = inputt[6:]
else:
    print('WARNING: Cannot find "{SSHA}" marker at the start! Assuming none present.')
input_hash_salt = base64.b64decode( inputt.encode('ascii') ).decode('ascii')
input_hash, salt = input_hash_salt[:40], input_hash_salt[40:]
calc_hash = hashlib.sha1( ( password + salt ).encode('ascii') ).hexdigest()
print( 'Input and calculated hashes match: ', input_hash == calc_hash )

 ,

olegd ()

7.6 and Python 3

Вышла бета RH 7.6, в описании написано :

Python 2 has been deprecated
Python 2 will be replaced with Python 3 in the next Red Hat Enterprise Linux (RHEL) major release. 

Я не много не понял это они про RH8 что ли ? Или это уже про RH7.6 так ?

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7-beta...

 ,

mx__ ()

Как решить socket.error: [Errno 32] Broken pipe закрытия сокета?

Как решить socket.error: [Errno 32] Broken pipe закрытия сокета? Клиентский часть tcp socket выводит разрыв соединение Traceback (most recent call last): File «clinsock.py», line 25, in tcpCliSock.send(inp) socket.error: [Errno 32] Broken pipe

Вот ссылка на код https://pastebin.com/vusD8dTi

Перемещено tailgunner из general

 

linux92 ()

Не получается установить PAM для питона

Добрый день! Я новичок в линуксе (буквально 3 дня назад установил, сильно не пинайте)) Пытаюсь установить PAM (pluggable authentication modules) чтобы после того как комп заблокировался (Super+L), питон скрипт разблокировал его через минуту например. Но установить PAM не получается. Делаю следующее:

sudo apt update sudo apt install python-pam python

import pam

Traceback (most recent call last): File «<stdin>», line 1, in <module> ImportError: No module named pam

Что я делаю не так? Ubuntu 18.04 LTS П.с. сорри, не знаю как сделать новую строку при создании темы

 , , , ,

svich ()

python2 выкинут из следующей версии RHEL

Пруф!

В общем, кто не спрятался, редхат не виноват. Переписывайте свой ынтырпрайз. Разработчики python'a обещали (не после поломки обратной совместимости 2.1 -> 2.3{2.4} -> 2.6/), что после 3k уж точно ничего ломать не будут, так что инфа соточка... И продолжают экспериментировать с статической типизацией в 3.5 и последующих...

P.S. Пока perl6 торт, хомячки бегут от кактуса к кактусу.

P.P.S. Добавил в dev, чтоб аноним тоже имел право голоса.

 , ,

Deleted ()

Работа с байт-строками в Python3

Здравствуйте

Перевожу одну библиотеку со второго на третий питон. 2to3 исправила мне принты и другие мелочи

Проблема со строками. Во py2 строки байтовые, чем автор воспользовался по полной: все двоичные данные хранятся и обрабатываются как строки.

Поиском прошелся по строковым литералам, заменил всякие d='\x05' на d=b'\x05'. Но тут объявился новый челлендж: во втором питоне индексация байтстроки возвращает байтстроку, а в третьем питоне она возвращает число.

Размышления насколько то или иное поведение логично оставим на совести Гвидо, но факт в том, что почти вся логика библиотеки стала невалидна.

Примеры фейлов:

data = b'123'

data[0] == b'1' # fail. data[0] == 49
# При этом 🤦
(b'1' in data) == True 

for i in data:
    # В py2 тут будут '1', '2', '3'. В py3 - 49, 50, 51

И если превый пример я с горем пополам победил, заменив везде data[0] на data[0:1]. То что делать с циклом?

Как в цикле получить байтстроки вместо чисел? Желательно не прибегая к декодированию (chr(49).encode(), bytes([49]))

 ,

makoven ()

Проблемы с установкой OpenFST Python Extension

Приветствую форумчане, такой вопрос возникла проблема с установкой OpenFST.

OS: Debian GNU/Linux Model: Aspire V3-571 V2.03 Kernel: 4.13.0 debian-amd64 GNOME

пытаюсь установить выдает вот такое сообщение: libtool: compile: g++ -DHAVE_CONFIG_H -I./../include -std=c++11 -MT fst.lo -MD -MP -MF .deps/fst.Tpo -c fst.cc -fPIC -DPIC -o .libs/fst.o In file included from ./../include/fst/accumulator.h:18:0, from ./../include/fst/label-reachable.h:13, from ./../include/fst/lookahead-matcher.h:13, from ./../include/fst/matcher-fst.h:13, from fst.cc:14: ./../include/fst/replace.h: In constructor 'fst::ArcIterator<fst::ReplaceFst<A, T, C> >::ArcIterator(const fst::ReplaceFst<A, T, C>&, fst::ArcIterator<fst::ReplaceFst<A, T, C> >::StateId)': ./../include/fst/replace.h:1198:57: error: expected ';' before '::' token ->template CacheBaseImpl<typename C::State, C>::InitArcIterator( ^~ Makefile:443: ошибка выполнения рецепта для цели «fst.lo» make[2]: *** [fst.lo] Ошибка 1 make[2]: выход из каталога «/home/sysadmin/openfst-1.5.4/src/lib» Makefile:358: ошибка выполнения рецепта для цели «install-recursive» make[1]: *** [install-recursive] Ошибка 1 make[1]: выход из каталога «/home/sysadmin/openfst-1.5.4/src» Makefile:414: ошибка выполнения рецепта для цели «install-recursive» make: *** [install-recursive] Ошибка 1 Requirements Status:

 , ,

nikbim96 ()

Как обновить Python до 3-й ветки в Slackware?

Намечается необходимость использовать Python, который в моём любимом дистрибутиве до сих пор 2.7.11. Хочу разведать подводные камни обновления до текущей (3.6.2) версии.

В описании этого пакета на SlackBuilds сказано, что можно просто установить рядом с существующим 2.7.11, и всё будет ок. Действительно так просто — собираю и ставлю как обычный пакет? Как потом bash будет понимать, что я хочу — по python2 scriptname.py или python3 scriptname.py? Команда python scriptname.py продолжит соответствовать python2?

Есть ли в системе что-то (помимо возможного своего творчества, естественно), завязанное на 2.x, или старую ветку можно безболезненно удалить?

 , ,

Hasek ()

Как записать следующие строки на Python 3?

si = file(os.devnull, 'r')
os.dup2(si.fileno(), sys.stdin.fileno())

Пишет, что функция file не найдена, но в примере она есть

 ,

pisipu ()

Gentoo, python_single_target

Два вопроса:

1. Можно из gentoo полностью удалить python2_7, оставив только python3_4 или 3_5?

2. Как получить список установленных пакетов, у которых значение python_single_target может принимать значение только python2_7 ?

 ,

pol01 ()

поясните про python3

во второй ветке можно было писать map(lambda x: smth, [somelist]) и на выходе получался обычный список. в третьей ветке для этого надо в явном виде вызывать функцию list(), т.к. map() возвращает объект с типом map. для чего так сделано? там все вычисления ленивые?

 

thunar ()