Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » pyQT4, запустить приложение, имея командную строку в QVariant [RSS Feed]

#1 Ноя. 20, 2008 21:27:57

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

pyQT4, запустить приложение, имея командную строку в QVariant

Есть командная строка commandLine типа QVariant. Мне необходимо асинхронно (не ожидая результата) запустить приложение (новый, независимый процесс). Необходимо сделать это кросс-платформенно. Вот так, конечно же, не работает:

params = commandLine.split(' ')
os.spawnv(os.P_NOWAIT, params[0], params)
Не спасает и “commandLine.toString()”. Как сделать правильно?



Офлайн

#2 Ноя. 20, 2008 21:40:33

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

pyQT4, запустить приложение, имея командную строку в QVariant

Пример, пригодный для запуска:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
from PyQt4 import QtCore

commandLine = QtCore.QVariant('gedit "~/test.txt"')

commandLine = commandLine.toString()
params = commandLine.split(' ')
os.spawnv(os.P_NOWAIT, params[0], params)



Офлайн

#3 Ноя. 21, 2008 13:51:46

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

pyQT4, запустить приложение, имея командную строку в QVariant

unicode(commandLine.toString()).split(' ')

Дело в том, что PyQt пытается самостоятельно конвертировать из str/unicode в QString и обратно всегда, когда только возможно при передаче аргументов в функцию, но как результат выполнения Qt-шной функции всегда возвращается QString, а не str/unicode.



Отредактировано (Ноя. 21, 2008 13:55:00)

Офлайн

#4 Ноя. 21, 2008 15:05:39

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

pyQT4, запустить приложение, имея командную строку в QVariant

poltergeist
unicode(commandLine.toString()).split(' ')
Это спасает, но не до конца. Русские имена файлов не прокатывают:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
from PyQt4 import QtCore

commandLine = QtCore.QVariant('C:/WINDOWS/notepad.exe C:/Temp/файл.txt')

params = unicode(commandLine.toString()).split(' ')
os.spawnv(os.P_NOWAIT, params[0], params)
Блокнот запускается, но не открывает файл, ругается: “Синтаксическая ошибка в имени файла, имени папки или метке тома.”.



Офлайн

#5 Ноя. 21, 2008 15:09:07

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

pyQT4, запустить приложение, имея командную строку в QVariant

poltergeist
…как результат выполнения Qt-шной функции всегда возвращается QString, а не str/unicode.
Именно в этом и проблема - как правильно преобразовать QString к “обычным” юникодным строкам. В инете не нашёл ничего, кроме советов применять функции str() или unicode(). Но они не помогают, если в строке есть кириллица.



Отредактировано (Ноя. 21, 2008 15:09:50)

Офлайн

#6 Ноя. 21, 2008 15:46:21

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

pyQT4, запустить приложение, имея командную строку в QVariant

# -*- coding: utf-8 -*-
from PyQt4 import QtCore

text = u'Доказательство'
print repr(text)

qtext = unicode(QtCore.QString(text))
print repr(qtext)

Вывод:
u'\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e'
u'\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e'
Получаются нормальные юникодные строки, вы не правы. А блокнот ругается, так как у вас проблемы с кодировками… у меня нет винды под рукой, не могу проверить… Ещё у вас ошибка в коде, не правильно с юникодом работаете…



Офлайн

#7 Ноя. 21, 2008 15:46:51

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

pyQT4, запустить приложение, имея командную строку в QVariant

Я ошибся, забыл “u” перед исходной строкой поставить. Всё работает.
poltergeist, спасибо большое!



Офлайн

  • Начало
  • » GUI
  • » pyQT4, запустить приложение, имея командную строку в QVariant[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version