LINUX.ORG.RU

Убить процесс в python

 


0

2

Здравствуйте, уважаемые форумчане. Просьба помочь. Имеются две кнопки. По нажатию на первую срабатывает функция запуска процеcса:

def on_task_open():
    global proc
    import subprocess
    from subprocess import Popen, PIPE


    proc = subprocess.Popen("konsole -workdir " + full_dir + " -e bash /*/*/OpenFOAM/QW", shell=True)

Работает нормально. Теперь нужно, чтобы после нажатия другой кнопки процесс завершался и консоль закрывалась. Но не работает(((

def on_task_close():
       proc.kill()


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

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

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

В первом сообщении и есть основной код.

Почитай про пространства имён. Судя по всему, ты пытаешься грохнуть несуществующий процесс. Поэтому у тебя и «не работает».

а вторая не работает

Потому что proc из первой функции и proc из второй - это две разных переменных?

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

В смысле если в on_task_close заменить proc.kill() на proc.terminate() то процесс не запускается? Он ведь у тебя в другой функции запускается.

MrClon ★★★★★
()

P.S. импорты полагается делать в начале файла, а не в теле функции. И зачем делать «from subprocess import Popen, PIPE» если до этого уже сделал «import subprocess»?

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

Так всё-таки «Первая ф-ция работает норм, т.е. консоль открывается и процесс запускается. а вторая не работает» или «и с тем и другим не запускается»?

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

Так а если глобальной ее сделать??

Ну вот ты сделал её глобальной в первой функции, и при этом пытаешься во второй работать с локальной как с глобальной. Ну и что тебе это дало, кроме неработающего кода?

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

Вот с этим все таки запускается: proc.kill()

Но пишет ошибку NameError: name 'proc' is not defined

хотя я объявил global proc

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

Но пишет ошибку NameError: name 'proc' is not defined

Естественно.

хотя я объявил global proc

Ещё раз: Почитай про пространства имён.

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

Если присваивание производится за пределами всех инструкций def, она является глобальной для всего файла.

я так и делаю. а он говорит не определено((

cdi1989
() автор топика
Ответ на: комментарий от cdi1989
>>> a = 'test'
>>> def f1():
...     global a
...     a = 'test 1'
...
>>> def f2():
...     a = 'test 2'
...
>>> print a
test
>>> f1()
>>> print a
test 1
>>> f2()
>>> print a
test 1
>>>

Почему у меня после вызова f2() переменная содержит значение 'test 1'?

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

В этом случае у меня даже не запускается((

def on_task_open():
    global proc
    import subprocess
    from subprocess import Popen, PIPE


    proc = subprocess.Popen("konsole -workdir " + full_dir + " -e bash /*/*/OpenFOAM/QW", shell=True)
def on_task_close():
       proc.kill()
cdi1989
() автор топика
Ответ на: комментарий от MrClon

Потому что она объявлена глобальной внутри f1() и, следовательно, именно это значение переменной «a» мы можем получить в других функциях

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

В этом случае у меня даже не запускается((

Что значит, «не запускается»? Ошибка происходит?

proc = subprocess.Popen(«konsole -workdir » + full_dir + " -e bash /*/*/OpenFOAM/QW", shell=True)

Ты, может быть, имел в виду "konsole -workdir " + full_dir + " -e 'bash /*/*/OpenFOAM/QW'" #Экранирован параметр к -e

Или, может быть, subprocess.Popen(['konsole', '-workdir', full_dir, '-e', 'bash /*/*/OpenFOAM/QW'])?

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

Блин, ты так хитро запутался что я даже не знаю как тебя распутать. Лучшее что могу посоветовать это забыть всё что ты знаешь об областях видимости переменных и прочесть о том как оно на самом деле.
Что с ходу нагуглилось https://ru.wikibooks.org/wiki/Python/Учебник_Python_3.1#.D0.9E.D0.B1.D0.BB.D0...

Но перед тем всё-же можешь подумать почему функция f1() обращается к глобальной переменной «a», а f2() к локальной.

MrClon ★★★★★
()
Ответ на: комментарий от shrub
a = 'test'    # 'а' - глобальная переменная 
def f1():
    global a  # 'а' теперь берётся из глобальной области видимости 
              # (действительно только для текущей области видимости, т.е в f1)
    a = 'test 1'

def f2():
    a = 'test 2' # Присваивание для локальной переменной 'a' (в текущей области видимости)
dimderbin
()
Последнее исправление: dimderbin (всего исправлений: 1)
Ответ на: комментарий от shrub

Судя по всему, ты пытаешься грохнуть несуществующий процесс. Поэтому у тебя и «не работает».
Потому что proc из первой функции и proc из второй - это две разных переменных?

Я не понял, в питоне что нельзя вывести ероры и варнинги в консоль куда-нибудь?
Если будет ошибка - сразу понятно что случилось.
К примеру: variable is not defined
И тогда человек знает, ок, почему это не определена, и далее курит про пространство имет и т.п.

kiotoze ★★★★
()

Народ, а нас случаем не внесут в реестр за такую провакационную тему как убийство?

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

оу, кажется я пропустил этот пост
П.С. звиняйте, нажрался... Наверное пора закрывать на сегодня вкладку с ЛОР

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