Найти - Пользователи
Полная версия: pyQT4, запустить приложение, имея командную строку в QVariant
Начало » GUI » pyQT4, запустить приложение, имея командную строку в QVariant
1
The gray Cardinal
Есть командная строка commandLine типа QVariant. Мне необходимо асинхронно (не ожидая результата) запустить приложение (новый, независимый процесс). Необходимо сделать это кросс-платформенно. Вот так, конечно же, не работает:
params = commandLine.split(' ')
os.spawnv(os.P_NOWAIT, params[0], params)
Не спасает и “commandLine.toString()”. Как сделать правильно?
The gray Cardinal
Пример, пригодный для запуска:
#!/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)
poltergeist
unicode(commandLine.toString()).split(' ')

Дело в том, что PyQt пытается самостоятельно конвертировать из str/unicode в QString и обратно всегда, когда только возможно при передаче аргументов в функцию, но как результат выполнения Qt-шной функции всегда возвращается QString, а не str/unicode.
The gray Cardinal
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)
Блокнот запускается, но не открывает файл, ругается: “Синтаксическая ошибка в имени файла, имени папки или метке тома.”.
The gray Cardinal
poltergeist
…как результат выполнения Qt-шной функции всегда возвращается QString, а не str/unicode.
Именно в этом и проблема - как правильно преобразовать QString к “обычным” юникодным строкам. В инете не нашёл ничего, кроме советов применять функции str() или unicode(). Но они не помогают, если в строке есть кириллица.
poltergeist
# -*- 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'
Получаются нормальные юникодные строки, вы не правы. А блокнот ругается, так как у вас проблемы с кодировками… у меня нет винды под рукой, не могу проверить… Ещё у вас ошибка в коде, не правильно с юникодом работаете…
The gray Cardinal
Я ошибся, забыл “u” перед исходной строкой поставить. Всё работает.
poltergeist, спасибо большое!
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