LINUX.ORG.RU

Передать команду в konsole и выполнить ее

 , ,


0

2

Здравствуйте, уважаемые знатоки Linux. Помогите плиз. Пишу приложение под Линукс на Питоне. Мне нужно передать в консоль команду, ну например «hepl» и выполнить ее там. Вот что я делаю: os.system('konsole -e help') При этом консоль запускается, но команда не выполняется и выводится сообщение: Предупреждение: Невозможно найти «help», вместо этого будет запущена программа «/bin/bash». Проверьте параметры вашего профиля.

Что сделать, чтобы заработало? заранее спасибо

Ответ на: комментарий от UVV

ну если я просто открою консоль и наберу help она же срабатывает. Почему я ее не могу программно выполнить, а не руками??

cdi1989
() автор топика

Вам бы надо UI *(PyQt, к примеру) начать изучать. Если у кого-то не будет konsole, к примеру, что делать будете?

EXL ★★★★★
()
Ответ на: комментарий от cdi1989

В «просто консоли» help обрабатывается интерпретатором bash, а не терминалом konsole. В моём zsh я получаю ожидаемое zsh: command not found: help. Т.е. help, вывод которого ты видишь, это встроенная функция bash.

UVV ★★★★★
()
Ответ на: комментарий от cdi1989

«просто открытие» реально означает konsole с запущенным bash

help - встроенная команда bash, а не программа в системе

Elyas ★★★★★
()

У тебя программа выполняется демоном, и ты хочешь так внезапно открыть пользователю консоль с маном? Если есть GUI, делай в этом GUI, если программа консольная, я вообще не понимаю в чем проблема.

backburner
()
Ответ на: комментарий от EXL

Моя программа представляет собой граф. интерф. и основывается на PyQt, но основное приложение выполняет некоторые расчеты, которые выполняются с помощью команд, переданных в консоль. Мне нужно, чтобы не юзер каждый раз вводил команду, а допусти нажал кнопку и консоль открылась, команда в нее передалась и выполнилась. А у меня вот что выдает Невозможно найти «help», вместо этого будет запущена программа «/bin/bash». Проверьте параметры вашего профиля. И так с любой командо, хотьб хелп хоть не хелп

cdi1989
() автор топика
Ответ на: комментарий от backburner

Проблема в том, что надо при нажатии кнопки выполнить два действия: перейти в каталог и выполнить специальную команду. в питоне я это делаю так: #os.system('konsole -workdir какая-то директория -e какая-то команда'). Так вот переход в директорию он делает, а команду не выполняет

cdi1989
() автор топика
Ответ на: комментарий от UVV

у меня на линуксе установлено консольное приложение для расчетов.И когда я хочу с ним работать, я открываю консоль, ввожу команду перехода в каталог с решаемой задачей, далее ввожу еще одну команду по запуску решения и у меня все решается. Эта программа ВЫПОЛНЯЕТ ВСЕ РАСЧЕТЫ через консоль и без нее мне не обойтись никак. Мне нужно всего лишь упростить задачу пользователю - чтобы он не открывал консоль, не вводил все вручную. Чтобы питон открывал консоль и передавал команды на выполнение

cdi1989
() автор топика
Ответ на: комментарий от cdi1989

У тебя 'команда' в той же директории? У меня работает вот так:

>>> os.system("konsole -e bash -c 'cd /tmp ; ./test.sh'")

Почему-то konsole переходит в директорию, указанную в workdir, но команду выполняет в домашней. Возможно это баг.

backburner
()
Ответ на: комментарий от cdi1989

Скорее всего потому что этого zapusk'а нету в PATH. Вообще, довольно странная затея. Лучше код этого консольного приложения интегрировать в твоё приложение и не парится. Иначе — запуск и парсинг информации. Пример можешь посмотреть тут:

http://www.saltycrane.com/blog/2007/12/pyqt-example-how-to-run-command-and/

EXL ★★★★★
()
Ответ на: комментарий от backburner

os.system(«konsole -e bash -c 'cd директория ; команда'») Вот так ничего не срабатывает. консоль мелькает на секунду и исчезает

cdi1989
() автор топика
Ответ на: комментарий от backburner

я новичок. вот так: os.system(«konsole — hold -e bash -c 'cd директория ; команда'»)?????

cdi1989
() автор топика
Ответ на: комментарий от backburner

пишет /bin/bash: icoFoam: команда не найдена. такое ощущение, что он эту команду запускает непонятно где, но только не в указанной директории

cdi1989
() автор топика

Есть идея. Запускаешь вместо konsole bash. На входной поток передаешь ему «help\n» и читаешь его выходной поток. Или тебе надо именно эмулятор терминала открыть? Объясни, зачем всё это?

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

у меня на линуксе установлено консольное приложение для расчетов.И когда я хочу с ним работать, я открываю консоль, ввожу команду перехода в каталог с решаемой задачей, далее ввожу еще одну команду по запуску решения и у меня все решается. Эта программа ВЫПОЛНЯЕТ ВСЕ РАСЧЕТЫ через консоль и без нее мне не обойтись никак. Мне нужно всего лишь упростить задачу пользователю - чтобы он не открывал консоль, не вводил все вручную. Чтобы питон открывал консоль и передавал команды на выполнение

cdi1989
() автор топика
Ответ на: комментарий от cdi1989

Чтобы питон открывал консоль и передавал команды на выполнение

Да, попробуй сделать колдунство с потоками. Программа на чём у тебя и как работает? Может есть смысл её вообще без bash'а запускать?

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

вот такой был вариант: os.system(«konsole -workdir /home/kalina/OpenFOAM/kalina-2.3.1/run/cavity -e icoFoam»)

Переход в каталог он делает, а команду «icoFoam» похоже выполняет как мне здесь сказали хрен знает где

cdi1989
() автор топика
Ответ на: комментарий от cdi1989

Отстань уже от konsole. Вот пример: http://www.saltycrane.com/blog/2007/12/pyqt-example-how-to-run-command-and/

Попробуй запусти его, введи в текстовом окне свою команду: "./icoFoam" и stdout посыпется в текстовое окно ниже. Элементарно и просто.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от cdi1989

ВЫПОЛНЯЕТ ВСЕ РАСЧЕТЫ через консоль

Что значит «через консоль»? Управляющие символы в konsole стали тьюринг-полными?

backburner
()
Ответ на: комментарий от cdi1989

Но ведь тебе потом надо туда как-то данные вводить или нет? Как icoFoam работает?

crutch_master ★★★★★
()
Ответ на: комментарий от EXL

Скопировал это пример и запустил. Действительно окно появилось но при вводе команды и нажатии энтера посыпались ошибки:

Traceback (most recent call last): File «/home/kalina/Рабочий стол/Первая задача - стратегия 1/test.py», line 34, in run_command stdouterr = os.popen4(cmd)[1].read() AttributeError: 'module' object has no attribute 'popen4'

cdi1989
() автор топика
Ответ на: комментарий от cdi1989

И? В чём проблема? Я первый раз вижу Python но с помощью Google и официальной документации переделал этот пример под Python3: http://i.imgur.com/FjUa3gv.png

import os
import sys
import subprocess
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from subprocess import Popen, PIPE, STDOUT
 
def main(): 
    app = QApplication(sys.argv) 
    w = MyWindow() 
    w.show() 
    sys.exit(app.exec_()) 
 
class MyWindow(QWidget): 
    def __init__(self, *args): 
        QWidget.__init__(self, *args) 
 
        # create objects
        label = QLabel(self.tr("Enter command and press Return"))
        self.le = QLineEdit()
        self.te = QTextEdit()
        self.te.setCurrentFont(QFont("Monospace"))
        self.te.setFontPointSize(9)

        # layout
        layout = QVBoxLayout(self)
        layout.addWidget(label)
        layout.addWidget(self.le)
        layout.addWidget(self.te)
        self.setLayout(layout) 

        # create connection
        self.connect(self.le, SIGNAL("returnPressed(void)"),
                     self.run_command)

    def run_command(self):
        cmd = str(self.le.text())
        p = Popen(cmd.split(), stdin=PIPE, stdout=PIPE, stderr=STDOUT)
        stdouterr, err = p.communicate(b"input data that is passed to subprocess' stdin")
        self.te.setText(stdouterr.decode("utf-8"))
  
if __name__ == "__main__": 
    main()
EXL ★★★★★
()

1. Konsole - это кдешная программа, она может быть и не установлена.

2. Можно же просто вызвать os.system( '<имя программы>' )

3. Если используешь PyQt, можно вызывать внешние программы QProcess::execute( '<имя команды>', <параметры> )

grondek
()
Ответ на: комментарий от EXL

Ну у меня тоже это пример запустился с командой ls -al. А если я ввожу другую, например перехода в каталог cd /home, то он пишет, что файл или каталог не найден((((

cdi1989
() автор топика

Смешной тред. Подписался

das_tier ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.