Гость
Map
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Python exec / 10 сообщений из 10, страница 1 из 1
01.01.2022, 22:23
    #40124421
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python exec
Код: python
1.
exec(open('MsgBoxOK.py', 'r', encoding='utf-8').read(), globalz, localz)


здравствуйте, нашёл, что можно так прописать, но не понял, как оформлять файл для того, чтобы не плодить много файлов, а чтобы было всё в одном, чтобы в одном файле было несколько процедур, как их оформить и как вызвать нужную?
и судя по названиям globalz, localz это вроде не оба в файле, можно подробностей? спасибо
...
Рейтинг: 0 / 0
02.01.2022, 08:27
    #40124443
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python exec
катастрофа,

Написание модулей/библиотек и выполнение скриптов
(их вызов, а так-же выполнение программ/приложений)
- это всё-таки довольно разные вещи,

если я правильно понял вопрос то это немного для другого
exec предназначен именно для выполнения модулей класса скрипт

для загрузки модулей типа package или libriary (и до целых фреймворков)
содержащих дефиниции функций/методов (часто по классам) существует import

вполне можно при желании прописать все дефиниции в одном mytestpackage.py файле через кучу отдельных def....
и потом после импорта вызывать их сколько угодно.
...
Рейтинг: 0 / 0
02.01.2022, 12:00
    #40124455
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python exec
vikkiv, разобрался я, одним словом можно файл MsgBoxOK.py оформлять как захочешь, потом и считывать согласно того как оформил
например знать, что между #start MsgBoxOK и #end MsgBoxOK то, что тебе нужно, это выход
я то думал, что можно также оформит её как функцию, в том числе и с параметрами, например def df_loc(loc_text): и вызывать её но с файла или оформить как то другим способом, словарь например.......
...
Рейтинг: 0 / 0
02.01.2022, 19:08
    #40124491
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python exec
но оказалось, что то, что сделано в этом запускаемом файле не передаётся обратно и как можно решить?
...
Рейтинг: 0 / 0
02.01.2022, 22:31
    #40124515
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python exec
ну спасает, что можно сделать через буфер обмена, но это костыли - надо очистить последний её объект
Код: python
1.
pyperclip.copy('')  # очистить буфер обмена=скопировать пустую строку


не подходит, как удалить последний объект буфера обмена? спасибо
...
Рейтинг: 0 / 0
03.01.2022, 00:18
    #40124527
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python exec
катастрофа,

зачем эти костыли и натягивание совы на глобус, есть стандартные подходы,
допустим в простейшем примере у тебя в файле mytestmodule .py
(лежащем в current working directory) определены какие-то функции:
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
def test1(a:int=5,b:int=8)-> int:
    """some test1 helper string - this is multiplication"""
    x:int=a
    y:int=b
    z:int=x*y
    return int(z)
def test2(a:int=8,b:int=2)-> int:
    """some test2 helper string - this is division"""
    x:int=a
    y:int=b
    z:int=x/y
    return int(z)


тогда в текущем скрипте их можно вызвать так:
Код: python
1.
2.
3.
4.
5.
6.
import mytestmodule as mt
print(mt.test1.__doc__)
print(mt.test1(4,5))
print(mt.test1(8))
print(mt.test2(2))
int(mt.test1(8)*mt.test2(2))
...
Рейтинг: 0 / 0
03.01.2022, 01:45
    #40124531
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python exec
vikkiv, спасибо за ответ, то что можно модулем сделать я знал, но меня пугало то, что я думал, что его нужно устанавливать..........сорри, это для меня новый опыт и пока комом, я действую так, тестирую:
Код: python
1.
2.
3.
import MsgBox as mt

print(mt.MsgBoxYesNo.__doc__)



а в файле MsgBox.py у меня простейший MsgBoxYesNo:
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
def MsgBoxYesNo(a:title,b:prompt):
	# vb_Yes_No = MsgBox("Вопрос", vbYesNo, "MsgBoxДа\Нет") 'VBA Yes = 6, No = 7
	title = 'sms' # title = заголовок
	prompt = 'txt' # prompt = подсказка, то есть тело формы, \n - абзац можно применять
	import pyperclip  # pip install pyperclip
	from tkinter import *
	def click_buttonY(): root.destroy(); pyperclip.copy('btn_textY'); # копирует текст в буфер обмена # print(btn_text); # exit(0) # destroy = уничтожать, разрушать
	def click_buttonN(): root.destroy(); pyperclip.copy('btn_textN'); # копирует текст в буфер обмена # print(btn_text); # exit(0) # destroy = уничтожать, разрушать
	root = Tk()
	# root.resizable(0, 0)  # делает неактивной кнопку Развернуть
	# root.attributes('-toolwindow', True)  # удаляет кнопки Свернуть Развернуть, удаляет Иконку
	### root.attributes('-disabled', True)  # блокирует кнопки Свернуть Развернуть Закрыть, и остальные элементы при нажатии в любом месте формы раздаётся звук
	# root.attributes('-fullscreen', True)  # делает во весь экран, кнопки Свернуть Развернуть Закрыть отсутствуют
	root.overrideredirect(True)  # отображет форму без шапки формы
	root.title(title)
	w=700 # ширина
	h=200 # высота
	w_monitor=250 # место появления формы на экране, ширина от края экрана
	h_monitor=250 # место появления формы на экране, высота от края экрана
	root.geometry(str(w) + 'x' + str(h) + '+' + str(w_monitor) + '+' + str(h_monitor)) 
	# названия шрифта, размер, стиль bold=полужирное начертание, normal — нормальное начертание
	Label1 = Label(text=prompt, font=('Arial', 12, 'bold'))
	Label1.place(x=10, y=10)
	# !!!!!!!!!!!!!! при использовании метода place() не надо использовать метод pack()
	# Label1.pack() # метод pack(), чтобы сделать элемент видимым
	btnY = Button(text='Yes',  # текст кнопки
             background='#555',  # фоновый цвет кнопки
             foreground='#ccc',  # цвет текста
             padx='30',  # ширина
             pady='10',  # высота
             font='16',  # высота шрифта
             command=click_buttonY)  # обработчик кнопки
	btnY.place(x=20, y=130)
	# !!!!!!!!!!!!!! при использовании метода place() не надо использовать метод pack()
	# btnY.pack() # метод pack(), чтобы сделать элемент видимым
	btnN = Button(text='No',  # текст кнопки
             background='#555',  # фоновый цвет кнопки
             foreground='#ccc',  # цвет текста
             padx='30',  # ширина
             pady='10',  # высота
             font='16',  # высота шрифта
             command=click_buttonN)  # обработчик кнопки
	btnN.place(x=180, y=130)
	# !!!!!!!!!!!!!! при использовании метода place() не надо использовать метод pack()
	# btnN.pack() # метод pack(), чтобы сделать элемент видимым
	root.mainloop()  # оставляем окно открытым


пока получаю ошибку
Traceback (most recent call last):
File "C:\pythonProject\sudrf.ru1.py", line 2, in <module>
import MsgBox as mt
File "C:\pythonProject\MsgBox.py", line 1
def MsgBoxYesNo(a:title,b:prompt):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: import * only allowed at module level
в чём я ошибаюсь, и как мне потом запускать с параметрами title и prompt?
спасибо
...
Рейтинг: 0 / 0
03.01.2022, 09:42
    #40124535
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python exec
ага, он ведь кроме того что пишет в явном виде что за ошибка
которую стоило-бы прочитать, понять, отформатировать и исправить либо переместив эти строчки в нужное место либо изменив форму импорта
ещё по идее должен подчёркивать эту ошибку в соответствующей строке в UI
лучше всего будет начать от простого к сложному вместо того чтобы сразу лезть в самое пекло без должного инструментария.
ну и вспомнить один из вариантов процесса дебаггинга - например убирать из кода строки пока не найдётся ошибка чтобы хотя-бы примерно определить где-же проблема.

кроме того приведённый код больше похож на интерактивную часть интерфейса - т.е. кусок программы выполняющий какие-то действия,
а не просто расчётная функция для вызова, при написании приложений всё-таки применяются немного другие подходы
решающие проблемы параллельности и блокировок (ожидания ввода например).

я такими вещами не занимаюсь, у нас на проектах специфика больше в сторону простого набор команд
и операций для обработки данных из получаемых датасетов с выдачей результата куда-то
поэтому вряд-ли смогу что-то посоветовать, т.к. это совсем другая область применения питона (front-end)
...
Рейтинг: 0 / 0
03.01.2022, 10:40
    #40124538
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python exec
п.с.
то как указаны title и prompt - это очевидно что не параметры, а что-то другое, которое надо-бы ещё и задать для начала, если это параметры то пишется по другому.
...
Рейтинг: 0 / 0
03.01.2022, 17:20
    #40124569
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Python exec
vikkiv, взял пример попроще с инета:
Код: python
1.
2.
3.
4.
5.
6.
# свой модуль, запуск:
import mymodule
mymodule.hello(title='11', prompt='22')
# файл mymodule.py
def hello(title, prompt):
    print('Hello, world!', title, prompt) # => Hello, world! 11 22


и на основе его сделал, спасибо не так страшен чёрт как его рисуют........
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Python exec / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]