Форум сайта python.su
Я получаю командную строку для асинхронного запуска нового процесса, которую задаёт пользователь в 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)
Офлайн
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)
Офлайн
poltergeistСтрока задаётся пользователем, в GUI. Заставлять пользователя самому разбивать, предлагая ему grid или список для заполнения - некрасиво, имхо.
зачем изначально задавать параметры как строку и лишний раз её парсить на аргументы?
Офлайн
Тогда ещё с тебя проверка правильности ввода коммандной строки, указание на ошибки пользователю и т.д. :) Красиво жить не запретишь…
Офлайн
poltergeistНет, не думаю. С какой бы стати? Gnome-terminal или cmd.exe тебе же не будут разжёвывать, что у тебя там не правильно. Просто скажут “файл не найден” или вообще запустят что-нибудь несусветное. Например, gedit просто откроет два новых файла “мой” и “файл.txt”, и никогда не скажет “а чё это у вас там за пробел в имени файла, уверены?” :).
Тогда ещё с тебя проверка правильности ввода коммандной строки, указание на ошибки пользователю и т.д.
Офлайн
Я не совсем понимаю, subprocess.Popen(params) или os.system(commandLine) разве не синхронно запускают процессы (т.е. всегда ждут их завершения)?
Офлайн
subprocess.Popen - может ждать, может не ждать =)
Вот такой код, не ждет и запускает учитывая переменную path:
import subprocess
commandLine = u'notepad.exe "c:\Python25\LICENSE.txt"'
subprocess.Popen(commandLine)
Отредактировано (Ноя. 22, 2008 16:12:04)
Офлайн
shiza
Спасибо!
Однако, чтобы под Windows реально запустилось с русскими именами файлов, приходится писать “subprocess.Popen(commandLine.encode('cp1251'))”, и никак иначе. Как правильно определить кодировку, чтобы избавиться в коде от строковой константы ‘cp1251’? Я так понимаю, если винда не русская, это ведь не сработает?
Офлайн
locale.getpreferredencoding() потянет?
Или locale.getdefaultlocale()?
Отредактировано (Ноя. 22, 2008 17:47:38)
Офлайн
Всё, я запутался насмерть.
#!/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):Из gnome-terminal строка gedit “/home/alex/фа йл.txt” запускается правильно.
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
Офлайн