Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Сборка модульного Python-проекта с помощью Nuitka. Выпадает ошибка: duplicate locals name.

FuntSterlingov Профи (535), на голосовании 4 дня назад
Собираю с помощью Nuitka модульный Python-проект (основной файл проекта и 2 файла модуля).

Собираю проект командой:
 python -m nuitka --standalone --deployment --mingw64 --remove-output --follow-imports --include-data-dir=data=data --product-name=Модульная_программа --file-version=2.0 --product-version=1.0 --copyright=Чернов_Сергей_Владимирович --company-name=www.numpers.ru --enable-plugin=tk-inter --windows-uac-admin --windows-console-mode=force --main=Main.pyw 

При сборке выпадает ошибка:
 ...
nuitka.Errors.NuitkaOptimizationError:
duplicate locals name
globals_None
module_dict
None
D:\Slideshow\Sa.pyw
None
D:\Slideshow\Li.pyw

Файлы проекта:

Main.pyw:
 # -*- coding: utf-8 -*- 
c=3

import Li
Li.test1(c)
from Li import a
Li.a

import Sa
from Sa import test2
test2(c)
from Sa import b

print(str(a+b))

Li.pyw:
 # -*- coding: utf-8 -*- 
def test1 (c):
global a
a=c+10
Sa.pyw:
 # -*- coding: utf-8 -*- 
def test2 (c):
global b
b=c+12

Кто знает в чем проблема? Программа в Python работает без ошибок.

Пробовал добавлять в команду сборки сами модули:
 python -m nuitka --standalone --deployment --mingw64 --remove-output --follow-imports --include-data-dir=data=data --product-name=Модульная_программа --file-version=2.0 --product-version=1.0 --copyright=Чернов_Сергей_Владимирович --company-name=www.numpers.ru --enable-plugin=tk-inter --windows-uac-admin --windows-console-mode=force --main=Main.pyw --main=Li.pyw --main=Sa.pyw 
Но это не помогло.
Голосование за лучший ответ
Sergio 2.1 Оракул (67615) 1 месяц назад
Ошибка возникает из-за конфликта при работе с глобальными переменными между модулями, так как компилятор не может правильно разрешить область видимости переменных a и b, которые объявлены через global в разных модулях.

Предлагаемые решения:

Вариант 1 - Реструктуризация кода:
 # Li.pyw 
a = None # Явная инициализация
def test1(c):
global a
a = c + 10
return a

# Sa.pyw
b = None # Явная инициализация
def test2(c):
global b
b = c + 12
return b

# Main.pyw
import Li
import Sa

c = 3
a = Li.test1(c)
b = Sa.test2(c)
print(str(a + b))
Вариант 2 - Использование классов:
 # Li.pyw 
class Calculator1:
def __init__(self):
self.a = None

def test1(self, c):
self.a = c + 10
return self.a

# Sa.pyw
class Calculator2:
def __init__(self):
self.b = None

def test2(self, c):
self.b = c + 12
return self.b

# Main.pyw
from Li import Calculator1
from Sa import Calculator2

c = 3
calc1 = Calculator1()
calc2 = Calculator2()
a = calc1.test1(c)
b = calc2.test2(c)
print(str(a + b))

Используйте более простую команду сборки для начала:
 python -m nuitka --standalone --follow-imports --main=Main.pyw  

Рекомендую начать с реструктуризации кода по варианту 1. Если это не поможет, переходите к варианту 2.
FuntSterlingovПрофи (535) 1 месяц назад
Добрый день, Sergio 2.1. Спасибо вам за желание помочь, но к сожалению это не помогло - выпадает та же ошибка, при любом предложенном вами варианте, хотя в самом Python работают оба варианта.
FuntSterlingovПрофи (535) 1 месяц назад
Никак не отпускала меня эта задача. Жаль было отказаться от модульности. Гугля, читая инструкцию Nuitka, снова гугля, пробуя разные варианты, как кода, так и команды сборки - я, наконец, методом "тыка", нашел ответ. Мой код был верный, иначе бы он не работал в Python'e.
FuntSterlingovПрофи (535) 1 месяц назад
Проблема была в команде сборки - при таком её виде:
 python -m nuitka --standalone --deployment --mingw64 --remove-output --follow-imports --include-data-dir=data=data --product-name=Модульная_программа --file-version=2.0 --product-version=1.0 --copyright=Чернов_Сергей_Владимирович --company-name=www.numpers.ru --enable-plugin=tk-inter --windows-uac-admin --windows-console-mode=force --windows-icon-from-ico=data/Main.ico --main=Main.pyw  
чтобы сборка завершилась удачно, необходимо чтобы файлы модулей имели расширение не *.pyw, а *.py. В этом случае ошибки не будет.
FuntSterlingovПрофи (535) 1 месяц назад
Если же вам необходимо, чтобы у модулей было расширение *.pyw, то команда сборки будет выглядеть так:
 python -m nuitka --standalone --mingw64 --follow-imports --enable-plugin=tk-inter --include-data-dir=data=data --remove-output --windows-console-mode=force --windows-uac-admin --product-name=Модульная_программа --file-version=1.0 --product-version=1.0 --copyright=Чернов_Сергей_Владимирович --company-name=www.numpers.ru --windows-icon-from-ico=data/Main.ico Main.pyw  

Так же я пришел к выводу, что именно модули - не обязательно делать с расширенем *.pyw, даже если в них предполагается использование не консольного режима, оконный режим Windows.
Похожие вопросы