Уведомления

Группа в Telegram: @pythonsu

#1 Май 8, 2021 00:48:09

Schlange
Зарегистрирован: 2016-11-28
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Как передать строку на принтер? (linux, матричный принтер epson)


В bash это просто. Например передать код настройки шрифта:

         double-strike ───┐┌───  bold
        double-width  ──┐││┌──  condensed
        italic        ─┐││││┌─  proportional
        underline     ┐││││││┌  12-cpi
a=$(printf %02x $(( 2#00011001 ))) ; printf "\x1b\x21\x$a" | lpr -l

А на питоне не получается. (Для наглядности выбрана команда прокрутить бумагу на строку вверх)
 print("\x1b\x0d | lpr -l")
sys.stdout.write("\x1b\x0d | lpr -l")

Почему не срабатывает
 | lpr -l
ЧЯДНТ?



ubuntu 14.04 / manjaro 16.10

Офлайн

#2 Май 9, 2021 06:26:28

XoFfiCEr
От:
Зарегистрирован: 2011-06-05
Сообщения: 50
Репутация: +  1  -
Профиль   Отправить e-mail  

Как передать строку на принтер? (linux, матричный принтер epson)

на принтер? но только если строка а файле

 file = 'line.txt'
import os
os.startfile(file, 'print')

но в linux startfile не работает.:(
зы насчет отправки кодов не знаю.



Отредактировано XoFfiCEr (Май 9, 2021 06:28:01)

Офлайн

#3 Май 9, 2021 13:11:01

Schlange
Зарегистрирован: 2016-11-28
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Как передать строку на принтер? (linux, матричный принтер epson)

на принтер? но только если строка а файле

Нет, не только. В linux можно просто в консоли написать
 echo "Hello world" | lpr -l
и принтер напечатает Hello world без прогона листа.

но в linux startfile не работает.

Тогда зачем об этом тут писать?

зы насчет отправки кодов не знаю.

https://epson.ru/upload/support/library/esc-p.pdf




ubuntu 14.04 / manjaro 16.10

Офлайн

#4 Май 9, 2021 14:23:57

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Как передать строку на принтер? (linux, матричный принтер epson)

Schlange
Почему не срабатывает
А с какого он должен срабатывать? python это не bash который любую строку интерполирует и пробует запустить. Может вам всеже книжечку какую прочитать по питону? Это же самые основы, которые слепым тыком плохо изучать.

Аналог в питоне
  
import subprocess  as sp
sp.run("""echo "Hello world" | lpr -l""",shell=True)



Отредактировано doza_and (Май 9, 2021 14:28:27)

Офлайн

#5 Май 9, 2021 16:26:29

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Как передать строку на принтер? (linux, матричный принтер epson)

ну такое на тему startfile не работает
html.html

 <!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>startfile? я за него</title>
    </head>
    <body>
        <p>
            <b>
                Этот текст будет полужирным, <i>а этот — ещё и курсивным</i>.
            </b>
        </p>
        <script>
            print();
        </script>
    </body>
</html>

 import subprocess  as sp
sp.run(r'"firefox.exe" "html.html" ', shell=True)

зы понимаю что немного не в тему но ТС держите это на заметку




1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Май 9, 2021 16:36:50)

Офлайн

#6 Май 10, 2021 00:16:35

Schlange
Зарегистрирован: 2016-11-28
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Как передать строку на принтер? (linux, матричный принтер epson)

doza_and
doza_and
А с какого он должен срабатывать? python это не bash который любую строку интерполирует и пробует запустить. Может вам всеже книжечку какую прочитать по питону? Это же самые основы, которые слепым тыком плохо изучать.

Спасибо за вариант. А без библиотеки никак? Что-то про эти основы нам не говорили ни на очных курсах питона, ни в популярных книжках. Наверное потому, что это отдельная библиотека, и за обязательную основу её ни преподаватели курсов, ни авторы книжек не сочли. Поэтому я про неё не знаю.



ubuntu 14.04 / manjaro 16.10

Офлайн

#7 Май 10, 2021 07:12:14

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как передать строку на принтер? (linux, матричный принтер epson)

Schlange
Что-то про эти основы нам не говорили ни на очных курсах питона, ни в популярных книжках. Наверное потому, что это отдельная библиотека, и за обязательную основу её ни преподаватели курсов, ни авторы книжек не сочли. Поэтому я про неё не знаю.
а о модуле os? Чтото типа такого:
 import os
os.system('echo "Hello world" | lpr -l')
os это стандартная либа, без нее ни с ОС ни с ФС нормально не повзаимодействуешь. Ее то должны были в книжках давать и на курсах.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Май 10, 2021 08:04:27)

Офлайн

#8 Май 10, 2021 08:38:04

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Как передать строку на принтер? (linux, матричный принтер epson)

Закрадываются у меня сомнения что вы неправильно понимаете не питон а то что делает операционная система и bash/sh/zsh/cmd.

 echo "dd" | lpr -l
bash читает команду из своего stdin до перевода строки и ее интерпретирует.
Те выше сказано вызови процесс echo передай ему аргумент командной строки “dd” запусти процесс lpr с аргументом -l и перекладывай буковки из stdout процесса echo в stdin процесса lpr.
Вот этим bash и занимается. Просит операционнную систему систему запустить два процесса, создать буфер в памяти который bash будет использовать для передачи данных. В случае ошибок bash попросит ОС показать сообщения на мониторчике.
В питоне вы говорите совершенно другое - напечатай в stdout строку “echo ‘dd’ | lpr -l”. Никаких просьб к питону что-то запустить и перенаправить ввод вывод тут нет.

Складывается впечатление что вы думаете что любые данные попадающие в stdout будут интерпретироваться bash или там святым духом например.
По вашему вот такая программа будет на принтер что-то слать?
 #include <stdio.h>
int main()
{
printf("\x1b\x0d | lpr -l");
return 0;
}
Попробуйте.
Я ожидаю что принтер не пострадает.

Тут разница подходов объясняется разным назначением инструментов. bash предназначен для запуска команд. Поэтому если ему скажешь “a” то он будет пытаться запустить “a”. А вывести в stdout bash 2+2 я смогу только с мануалом. А в питоне обратная ситуация. Для запуска процессов нужен subprocess или os а 2+2 легко вывести print(2+2).



Отредактировано doza_and (Май 10, 2021 09:29:03)

Офлайн

#9 Май 10, 2021 17:36:05

Schlange
Зарегистрирован: 2016-11-28
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Как передать строку на принтер? (linux, матричный принтер epson)

PEHDOM
os это стандартная либа, без нее ни с ОС ни с ФС нормально не повзаимодействуешь. Ее то должны были в книжках давать и на курсах.

OS была, но использовать os.system почему-то из-за каких-то проблем не рекомендовали, и поэтому на ней внимание не акцентировали.



ubuntu 14.04 / manjaro 16.10

Офлайн

#10 Май 10, 2021 18:07:05

Schlange
Зарегистрирован: 2016-11-28
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Как передать строку на принтер? (linux, матричный принтер epson)

doza_and
Складывается впечатление что вы думаете что любые данные попадающие в stdout будут интерпретироваться bash

Спасибо за подробный ответ. Признаться, что-то такое я и думал.

Поясните ещё такой вопрос, пожалуйста:

Какая между ними принципиальная разница? Почему os небезопасен, и почему call устарел? Всегда ли лучше использовать run?

 import os
import subprocess
cmd = """echo "os.\x1b\x45system\x1b\x46" | lpr -l """
os.system(cmd)
cmd = """echo "subprocess.\x1b\x45run\x1b\x46" | lpr -l """
subprocess.run(cmd,shell=True)
cmd = """echo "subprocess.\x1b\x45call\x1b\x46" | lpr -l """
subprocess.call(cmd,shell=True)
# \x1b\x45 — Печать жирным шрифтом на принтере
# \x1b\x46 — Прекратить печать жирным шрифтом



ubuntu 14.04 / manjaro 16.10

Отредактировано Schlange (Май 10, 2021 18:09:57)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version