Найти - Пользователи
Полная версия: Как передать строку на принтер? (linux, матричный принтер epson)
Начало » Python для новичков » Как передать строку на принтер? (linux, матричный принтер epson)
1 2
Schlange

В 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
ЧЯДНТ?
XoFfiCEr
на принтер? но только если строка а файле
 file = 'line.txt'
import os
os.startfile(file, 'print')

но в linux startfile не работает.:(
зы насчет отправки кодов не знаю.
Schlange
на принтер? но только если строка а файле

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

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

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

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

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


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

Аналог в питоне
  
import subprocess  as sp
sp.run("""echo "Hello world" | lpr -l""",shell=True)
AD0DE412
ну такое на тему 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)

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


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

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

doza_and
Закрадываются у меня сомнения что вы неправильно понимаете не питон а то что делает операционная система и 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).

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

OS была, но использовать os.system почему-то из-за каких-то проблем не рекомендовали, и поэтому на ней внимание не акцентировали.
Schlange
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 — Прекратить печать жирным шрифтом
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB