Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 23.03.2016
Сообщений: 47

Как записать код в ВАТ'ник и выполнить его

02.05.2018, 10:49. Показов 3517. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть система: человек выбирает управление программой через GUI либо через командную строку. При выборе режима командной строки, появляется знак $, и пользователь может вводить команды. После того, как он нажал Enter, его код записывается в BAT-файл и запускается. Но всё, что делает этот BAT'ник, это запускает python-строку. Как сделать так, чтобы он вписывал код пользователя и выполнял его? Или такое невозможно?

Код обработки КС:
Python
1
2
3
4
5
6
7
8
command = input('$ ')
print('Обработка запроса...')
time.sleep(2)
handler_create = open('handler.bat', 'w')
handler_create.write('python')
handler_create.write(command)
handler_create.close()
os.startfile('handler.bat')
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2018, 10:49
Ответы с готовыми решениями:

Как выполнить код вне окна с виджетами без его закрытия?
Здравствуйте, уважаемые коллеги. Помогите пожалуйста разобраться с PyQt5. Я начал осваивать его пару месяцев назад и не до конца...

Как получить html код страницы расположенной на другом домене и записать его в переменную?
Как получить html-код страницы расположенной на другом домене и записать его в переменную?

Как правильнее записать код.Так чтобы его еще можно было вставить в Word?
Здесь сначала пишется интеграл потом первообразная потом вычисленное и округленное значение. Добавлено через 3 минуты Print выводит...

19
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
02.05.2018, 11:02
Поясни какие могут быть команды и почему bat-файл?
0
0 / 0 / 1
Регистрация: 23.03.2016
Сообщений: 47
02.05.2018, 11:14  [ТС]
Допустим, пользователь хочет создать пользователя, но не знает как. Для этого он пропишет команду: create.info()
Или если он создаёт пользователя: create.user.params(user, password, root)
Или БД: create.database.params(DBname, DBid, DBcolumns)

Я хотел сделать так, чтобы программа обращалась к главному файлу (main.py, пользователь же работает в своём файле или manage.py) и обрабатывала запрос пользователя, но не получилось (либо я не понял, как это сделать). Тогда я придумал записывать код пользователя в BAT и выполнять его. Но, как вы видите, тоже начались проблемы.

Могу скинуть архив с исходниками программы, чтобы Вы могли лучше понять, о чём идёт речь
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
02.05.2018, 11:28
Цитата Сообщение от StiverZ Посмотреть сообщение
Могу скинуть архив с исходниками программы, чтобы Вы могли лучше понять, о чём идёт речь
Скиньте, не очень понятно
0
0 / 0 / 1
Регистрация: 23.03.2016
Сообщений: 47
02.05.2018, 11:30  [ТС]
Архив. Если всё равно будет что-то непонятно (т.к. код забыл комментировать), придётся писать мини-документацию
Вложения
Тип файла: rar Программа.rar (5.8 Кб, 2 просмотров)
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
02.05.2018, 13:22
Первая проблема

Python
1
2
handler_create.write('python')
handler_create.write(command)
Эти команды записывают в файл одной строкой, то есть на выходе будет pythonкоманда, но даже если вставить пробел все равно работать не будет, так как python если его вызвать python команда ожидает название файла на входе
Можно добавить файл который будет выполнять команды и формировать строку так python dest.py команда

Python
1
2
3
4
5
6
7
handler_create = open('handler.bat', 'w')
    handler_create.write('python')
    handler_create.write(' ')
    handler_create.write('dest.py')
    handler_create.write(' ')
    handler_create.write(command)
    handler_create.close()
ну и в файле получать аргументы строки

Python
1
2
3
4
5
import sys
 
if __name__ == "__main__":
    if len (sys.argv) > 1:
        # Тут проверяем команду и что-то делаем
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.05.2018, 13:55
Цитата Сообщение от StiverZ Посмотреть сообщение
Но всё, что делает этот BAT'ник, это запускает python-строку. Как сделать так, чтобы он вписывал код пользователя и выполнял его?
Я вижу, что ваш питоновский код записывает в батник только "python". А что вы хотели-то? Ну вписывайте код пользователя и выполняйте, в чём проблема?
0
0 / 0 / 1
Регистрация: 23.03.2016
Сообщений: 47
02.05.2018, 14:28  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Я вижу, что ваш питоновский код записывает в батник только "python". А что вы хотели-то? Ну вписывайте код пользователя и выполняйте, в чём проблема?
Если после ввода команды открыть файл handler.bat, то там вы увидите следующее:
Bash
1
2
python
create.user.params('Admin', '12345', root=True) #или другая команда, в зависимости от того, что вы ввели
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
02.05.2018, 14:34
Цитата Сообщение от StiverZ Посмотреть сообщение
Если после ввода команды открыть файл handler.bat, то там вы увидите следующее:
python
create.user.params('Admin', '12345', root=True) #или другая команда, в зависимости от того, что вы ввели
У меня выводит pythoncreate.user.params('Admin', '12345', root=True)

Но ваш вариант не сработает python и команда должны быть на одной строке
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.05.2018, 14:35
Цитата Сообщение от StiverZ Посмотреть сообщение
create.user.params('Admin', '12345', root=True)
Но такой код не поддерживается батниками.

И что такое create и т. д.? Если питоновские объекты - то было бы естественно оперировать с ними питоном, а не batch.
0
0 / 0 / 1
Регистрация: 23.03.2016
Сообщений: 47
02.05.2018, 14:52  [ТС]
Цитата Сообщение от ТабуретY Посмотреть сообщение
Можно добавить файл который будет выполнять команды и формировать строку так python dest.py команда
Python
1
2
3
4
5
6
7
handler_create = open('handler.bat', 'w')
handler_create.write('python')
handler_create.write(' ')
handler_create.write('dest.py')
handler_create.write(' ')
handler_create.write(command)
handler_create.close()
Есть более короткий и удобный способ:
Python
1
2
3
handler_create = open('handler.bat', 'w')
handler_create.write('python dest.py {}'.format(command))
handler_create.close()
Цитата Сообщение от ТабуретY Посмотреть сообщение
ну и в файле получать аргументы строки
Я до этого и планировал так делать. Но как я буду проверять такую команду:
Python
1
create.user.params('<имя пользователя>', '<пароль>', 'root')
или любую другую, где будут указываться аргументы для функций, типа имя, доступ, кол-во колонок и другое?

Добавлено через 7 минут
Цитата Сообщение от dondublon Посмотреть сообщение
Но такой код не поддерживается батниками
Мне нужно было, чтобы этот код выводился в python-консоль

Добавлено через 1 минуту
Цитата Сообщение от ТабуретY Посмотреть сообщение
У меня выводит pythoncreate.user.params('Admin', '12345', root=True)
Мне нужно было торопиться, поэтому забыл добавить здесь \n
Python
1
handler_create.write('python')
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
02.05.2018, 14:56
Цитата Сообщение от StiverZ Посмотреть сообщение
где будут указываться аргументы для функций, типа имя, доступ, кол-во колонок и другое?
Можно так достать аргументы функции

Python
1
2
3
4
5
6
7
8
s = "create.user.params('<имя пользователя>', '<пароль>', 'root')"
 
import re 
 
regex = re.compile(".*?\((.*?)\)") 
result = re.findall(regex, s) 
 
print(result[0].split(','))
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.05.2018, 15:21
Цитата Сообщение от StiverZ Посмотреть сообщение
Мне нужно было, чтобы этот код выводился в python-консоль
Возможно, батники это и умеют, но зачем такие сложности?

Вы из Питона формируете батник, который затем должен будет что-то делать с питоновскими объектами. Почему бы питоновскими объектами не оперировать из Питона?
0
0 / 0 / 1
Регистрация: 23.03.2016
Сообщений: 47
02.05.2018, 15:56  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Вы из Питона формируете батник, который затем должен будет что-то делать с питоновскими объектами. Почему бы питоновскими объектами не оперировать из Питона?
Обработчики кода находятся в файле main.py, мы же работаем в файле manage.py. (Для удобства использования) В этом файле загружается режим командной строки(если пользователь выбрал его), после чего создаётся переменная со значением input:
Python
1
command = input('$ ')
Пользователь при вводе команды присваивает значение переменной введённый им текст и он сохраняется в виде строки(string), а мне нужно, чтобы эта строка являлась кодом, т.е. чтобы интерпретатор воспринимал его не как текст, а как строчку кода, типа print('Hello World!'). Поэтому была идея сохранять её в BAT'ник и из него уже интерпретатор воспринимает как код.

Попробуйте написать следующее: программа просит пользователя ввести команду, допустим, print('Hello World!{}'.format('<любое значение>') и сделать так, чтобы программа обрабатывала это как интерпретатор. Возможно, это поможет лучше всего понять, почему было решение использовать BAT-файлы
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
02.05.2018, 16:18
Лучший ответ Сообщение было отмечено StiverZ как решение

Решение

Цитата Сообщение от StiverZ Посмотреть сообщение
было решение использовать BAT-файлы
Бесполезное решение. Через батники вы не сможете вклиниться в интерактивный режим интерпретатора - он же REPL.
Максимум, вы можете отправлять интерпретатору валидный python код в виде строки, где инструкции разделены точкой с запятой. Интерпретатор понимает такой ввод с параметром :
Python
1
2
3
\>python -c "import math; print(math.pi); import json; print(json.dumps({'1':1,'2':2}))"
3.141592653589793
{"1": 1, "2": 2}
Или использовать eval - тут никакой shell не нужен. Тупо отдаете введенный код функции eval - она его выполняет в текущем контексте. Но все возможные последствия бесконтрольного выполнения любого кода будут уже на вашей совести.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.05.2018, 16:21
Цитата Сообщение от StiverZ Посмотреть сообщение
Обработчики кода находятся в файле main.py, мы же работаем в файле manage.py.
На этом пока можно и остановиться.
"Мы работаем" не в файле, мы работаем в процессе. Именно в процессе находятся ваши объекты.
Внимание, важный вопрос - main и manage работают в одном процессе или в разных? С одним проще. Вы с батником уже начали их разделять - а вы уверены, что это нужно?
Если нужно - то питоновский функционал к вашим услугам: https://docs.python.org/3.6/li... ssing.html , но советую всё-таки сначала убедиться, что с одним процессом ничего не получается.

Цитата Сообщение от StiverZ Посмотреть сообщение
Попробуйте написать следующее: программа просит пользователя ввести команду, допустим, print('Hello World!{}'.format('<любое значение>')
Да влёгкую. Функция eval. Или exec.
1
0 / 0 / 1
Регистрация: 23.03.2016
Сообщений: 47
02.05.2018, 19:39  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Максимум, вы можете отправлять интерпретатору валидный python код в виде строки, где инструкции разделены точкой с запятой. Интерпретатор понимает такой ввод с параметром -с:
Помог этот совет (exec и evel я и не пробовал), и в итоге у меня получается следующее:
Python
1
2
3
handler_create = open('handler.bat', 'w')
handler_create.write('python -c "from main import *; {}"'.format(command))
handler_create.close()
Спасибо за помощь
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.05.2018, 20:17
Цитата Сообщение от StiverZ Посмотреть сообщение
Помог этот совет (exec и evel я и не пробовал),
А вы попробуйте, вдруг понравится.
0
0 / 0 / 1
Регистрация: 23.03.2016
Сообщений: 47
02.05.2018, 20:29  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
А вы попробуйте, вдруг понравится
'python -c "<код>"' - проще, как по мне
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
03.05.2018, 11:32
Цитата Сообщение от StiverZ Посмотреть сообщение
'python -c "<код>"' - проще, как по мне
Нет, это сложнее. Хотя бы потому, что начинается второй процесс со всеми вытекающими.

Плюс всякие мелочи, типа потребности парсить вывод. А ещё его надо будет получить. Плюс, возможно, будут не настроены пути и ваш python.exe он просто не найдёт. (Да, проблема решаема, но для новичка вроде вас потребует времени.) Плюс, если на винде и с русским текстом - возможна проблема с кодировками. Уверен, вы не в курсе, какую кодировку используют батники. Подсказка - это не 1251 и не utf.
Ввод новой сущности всегда потенциально создаёт проблемы.

Но это всё мелочи, а потом начнётся самое прикольное - вы захотите получить объект в ваш порождающий процесс.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2018, 11:32
Помогаю со студенческими работами здесь

Выполнить табуляцию параметрически заданной функции, записать ее в файл и вывести его на экран
Выполнить табуляцию параметрически заданной функции (Трисектриса), записать ее в файл и вывести его на экран. Построить и вывести на экран...

Выполнить js код на клиенте, чтобы пользователь его не увидел
В исключительно мирных целях. Хочу предоставить своего рода демку - результат выполнения js кода на клиенте, но не хочу, чтобы пользователь...

Составить программу, которая позволяет ввести с клавиатуры шестнадцатеричное число и записать его в переменную a, выполнить требуемую проверку.
Составить программу, которая позволяет ввести с клавиатуры шестнадцатеричное число и записать его в переменную a типа unsigned. Выполнить...

Получить html код страницы и записать его в TextBox
Как получить html код страницы и записать его в TextBox

Ватник на удаление папки
Всем привет!!! Подскажите как можно удалить папки (с помощью bat) с таким именем - &quot;076aca8e-30cb-474e-9955-2ad400b170e3&quot;, т.е...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru