Найти - Пользователи
Полная версия: Асинхронный запуск нового процесса
Начало » Python для экспертов » Асинхронный запуск нового процесса
1 2 3 4
The gray Cardinal
Я получаю командную строку для асинхронного запуска нового процесса, которую задаёт пользователь в GUI. Пытаюсь запустить новый процесс, примерно так:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os

commandLine = u'C:/WINDOWS/notepad.exe "C:/Temp/мой файл.txt"'

params = commandLine.split(' ')
os.spawnve(os.P_NOWAIT, params[0], params, os.environ)
Есть несколько проблем.
1. Хотелось бы пользоваться переменной окружения PATH, чтобы иметь возможность писать просто “notepad”, а не “C:/WINDOWS/notepad.exe”. Насколько я понял, эту возможность даёт os.spawnvpe(), но её нет под Windows, а мне нужно кросс-платформенно.
2. Если в командной строке употреблены двойные кавычки для указания путей с пробелами, .split(' ') работает неверно.
3. Хотелось бы правильно интерпретировать тильду (~) для определения домашнего каталога.

По первому и третьему вопросу пока не приходит в голову ничего, кроме “ручного” перелопачивания os.environ с поиском исполняемого файла, и тупой замены “~” на os.environ. Но это как-то глупо выглядит… По второму вопросу пока вообще нет идей.
poltergeist
commandLine = u'notepad.exe “C:/Temp/мой файл.txt”'
params = u'notepad.exe', u'C:/Temp/мой файл.txt'
1) subprocess.Popen(params) или os.system(commandLine)
2) зачем изначально задавать параметры как строку и лишний раз её парсить на аргументы?
3) os.path.expanduser('~/file') == ‘/home/poltergeist/file’ - в винде тож самое…
The gray Cardinal
poltergeist
зачем изначально задавать параметры как строку и лишний раз её парсить на аргументы?
Строка задаётся пользователем, в GUI. Заставлять пользователя самому разбивать, предлагая ему grid или список для заполнения - некрасиво, имхо.
И ещё: мне нужен асинхронный запуск, т.к. моё python-приложение может запросто (а в большинстве случаев вообще - должно) завершиться раньше, чем запущенный им же самим процесс.
poltergeist
Тогда ещё с тебя проверка правильности ввода коммандной строки, указание на ошибки пользователю и т.д. :) Красиво жить не запретишь…
The gray Cardinal
poltergeist
Тогда ещё с тебя проверка правильности ввода коммандной строки, указание на ошибки пользователю и т.д.
Нет, не думаю. С какой бы стати? Gnome-terminal или cmd.exe тебе же не будут разжёвывать, что у тебя там не правильно. Просто скажут “файл не найден” или вообще запустят что-нибудь несусветное. Например, gedit просто откроет два новых файла “мой” и “файл.txt”, и никогда не скажет “а чё это у вас там за пробел в имени файла, уверены?” :).
А у меня пользователь пусть сам проверяет свою строку на запускабельность, предварительно. Мне нужно просто правильно запустить правильную строку, вот и всё.
The gray Cardinal
Я не совсем понимаю, subprocess.Popen(params) или os.system(commandLine) разве не синхронно запускают процессы (т.е. всегда ждут их завершения)?
shiza
subprocess.Popen - может ждать, может не ждать =)

Вот такой код, не ждет и запускает учитывая переменную path:

import subprocess

commandLine = u'notepad.exe "c:\Python25\LICENSE.txt"'
subprocess.Popen(commandLine)
The gray Cardinal
shiza
Спасибо!
Однако, чтобы под Windows реально запустилось с русскими именами файлов, приходится писать “subprocess.Popen(commandLine.encode('cp1251'))”, и никак иначе. Как правильно определить кодировку, чтобы избавиться в коде от строковой константы ‘cp1251’? Я так понимаю, если винда не русская, это ведь не сработает?
The gray Cardinal
locale.getpreferredencoding() потянет?
Или locale.getdefaultlocale()?
The gray Cardinal
Всё, я запутался насмерть.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, locale, subprocess

commandLine = u'gedit "/home/alex/фа йл.txt"'

commandLine = commandLine.encode(locale.getdefaultlocale()[1])
commandLine = os.path.expanduser(commandLine)
subprocess.Popen(commandLine)
Traceback (most recent call last):
File “/home/alex/Job/test.py”, line 9, in <module>
subprocess.Popen(commandLine)
File “/usr/lib/python2.5/subprocess.py”, line 594, in __init__
errread, errwrite)
File “/usr/lib/python2.5/subprocess.py”, line 1147, in _execute_child
raise child_exception
OSError: No such file or directory
Из gnome-terminal строка gedit “/home/alex/фа йл.txt” запускается правильно.
Я не понимаю, что происходит :(.
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