Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 22, 2008 11:38:30

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск нового процесса

Я получаю командную строку для асинхронного запуска нового процесса, которую задаёт пользователь в 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. Но это как-то глупо выглядит… По второму вопросу пока вообще нет идей.



Офлайн

#2 Ноя. 22, 2008 12:32:09

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск нового процесса

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’ - в винде тож самое…



Отредактировано (Ноя. 22, 2008 12:32:44)

Офлайн

#3 Ноя. 22, 2008 13:05:23

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск нового процесса

poltergeist
зачем изначально задавать параметры как строку и лишний раз её парсить на аргументы?
Строка задаётся пользователем, в GUI. Заставлять пользователя самому разбивать, предлагая ему grid или список для заполнения - некрасиво, имхо.
И ещё: мне нужен асинхронный запуск, т.к. моё python-приложение может запросто (а в большинстве случаев вообще - должно) завершиться раньше, чем запущенный им же самим процесс.



Офлайн

#4 Ноя. 22, 2008 13:35:26

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск нового процесса

Тогда ещё с тебя проверка правильности ввода коммандной строки, указание на ошибки пользователю и т.д. :) Красиво жить не запретишь…



Офлайн

#5 Ноя. 22, 2008 14:13:57

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск нового процесса

poltergeist
Тогда ещё с тебя проверка правильности ввода коммандной строки, указание на ошибки пользователю и т.д.
Нет, не думаю. С какой бы стати? Gnome-terminal или cmd.exe тебе же не будут разжёвывать, что у тебя там не правильно. Просто скажут “файл не найден” или вообще запустят что-нибудь несусветное. Например, gedit просто откроет два новых файла “мой” и “файл.txt”, и никогда не скажет “а чё это у вас там за пробел в имени файла, уверены?” :).
А у меня пользователь пусть сам проверяет свою строку на запускабельность, предварительно. Мне нужно просто правильно запустить правильную строку, вот и всё.



Офлайн

#6 Ноя. 22, 2008 14:24:15

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск нового процесса

Я не совсем понимаю, subprocess.Popen(params) или os.system(commandLine) разве не синхронно запускают процессы (т.е. всегда ждут их завершения)?



Офлайн

#7 Ноя. 22, 2008 15:39:09

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск нового процесса

subprocess.Popen - может ждать, может не ждать =)

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

import subprocess

commandLine = u'notepad.exe "c:\Python25\LICENSE.txt"'
subprocess.Popen(commandLine)



Отредактировано (Ноя. 22, 2008 16:12:04)

Офлайн

#8 Ноя. 22, 2008 17:18:14

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск нового процесса

shiza
Спасибо!
Однако, чтобы под Windows реально запустилось с русскими именами файлов, приходится писать “subprocess.Popen(commandLine.encode('cp1251'))”, и никак иначе. Как правильно определить кодировку, чтобы избавиться в коде от строковой константы ‘cp1251’? Я так понимаю, если винда не русская, это ведь не сработает?



Офлайн

#9 Ноя. 22, 2008 17:26:32

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск нового процесса

locale.getpreferredencoding() потянет?
Или locale.getdefaultlocale()?



Отредактировано (Ноя. 22, 2008 17:47:38)

Офлайн

#10 Ноя. 22, 2008 20:31:58

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск нового процесса

Всё, я запутался насмерть.

#!/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” запускается правильно.
Я не понимаю, что происходит :(.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version