Python 2.6 в Windows: как завершить подпроцесс. Popen с “shell=True” аргументом?

Правильным решением будет отправить его через веб-сервис. Но если вы хотите сделать это по электронной почте в фоновом режиме вашего приложения, вы должны предоставить возможность войти на адрес электронной почты и отправить его, это все равно, что создать еще один почтовый клиент. Подумайте о создании веб-службы, на которую вы будете отправлять эти заказы. Это лучшее решение, чем отправка электронных писем из фона вашего приложения.

7
задан tshepang 15 January 2014 в 16:37
поделиться

4 ответа

На основе подсказки, данной в ответе Thomas Watnedal, где он указывает, что просто оболочка на самом деле уничтожается в примере, я расположил следующую функцию, которая решает проблему для моего сценария, на основе примера, данного в библиотеке PyWin32 Mark Hammond:

procname является названием процесса, как замечено в Диспетчере задач без расширения, например, FFMPEG.EXE был бы killProcName ("FFMPEG"). Обратите внимание, что функция является довольно медленной, поскольку она выполняет перечисление всех текущих рабочих процессов, таким образом, результат не мгновенен.

import win32api
import win32pdhutil
import win32con

def killProcName(procname):
    """Kill a running process by name.  Kills first process with the given name."""
    try:
        win32pdhutil.GetPerformanceAttributes("Process", "ID Process", procname)
    except:
        pass

    pids = win32pdhutil.FindPerformanceAttributesByName(procname)

    # If _my_ pid in there, remove it!
    try:
        pids.remove(win32api.GetCurrentProcessId())
    except ValueError:
        pass

    handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, pids[0])
    win32api.TerminateProcess(handle, 0)
    win32api.CloseHandle(handle)
2
ответ дан 6 December 2019 в 15:31
поделиться

Почему Вы используете shell=True?

Просто не делайте этого. Вам не нужен он, это вызывает оболочку, и это бесполезно.

Я не признаю, что это должно быть True, потому что это не делает. Используя shell=True только приносит Вам проблемы и никакое преимущество. Просто избегайте его любой ценой. Если Вы не выполняете некоторую оболочку внутренняя команда, Вам не нужна она, никогда.

8
ответ дан 6 December 2019 в 15:31
поделиться

При использовании shell=True и назывании оконечным на процессе, Вы на самом деле уничтожаете оболочку, не процесс блокнота. Оболочка была бы тем, что указано в переменной среды COMSPEC.

Единственным путем я могу думать об уничтожении этого процесса блокнота, должен был бы использовать Win32process. EnumProcesses () для поиска процесса затем уничтожьте его с помощью win32api. TerminateProcess. Вы однако не сможете отличить процесс блокнота от других процессов с тем же именем.

5
ответ дан 6 December 2019 в 15:31
поделиться

Python 2.6 имеет метод уничтожения для подпроцесса. Объекты Popen.

http://docs.python.org/library/subprocess.html#subprocess.Popen.kill

-1
ответ дан 6 December 2019 в 15:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: