Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 12, 2012 11:11:17

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

qt4 ассоциация файлов

Написал xml пассер, хочу в Windows сделать ассоциацию xml файлов со
своим пассером или просто открыть в пассере xml при наведении на python-скрипт, подскажите как это можно сделать?
Если я правильно понимаю, чтобы работала ассоциация, нужно передавать
имя файла как параметр python-скрипту и дальше с ним как-то работать.



Офлайн

#2 Ноя. 12, 2012 18:14:08

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

qt4 ассоциация файлов

Вроде, самое простое - это сделать *.exe файл, например, с помощью cx-freeze

Офлайн

#3 Ноя. 13, 2012 07:57:04

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

qt4 ассоциация файлов

Хорошо сделаю exe файл, а как исполняемый файл будет понимать, что на него перетащили или ассоциировали с ним файл.
Разве это не так работает? к примеру исполняемый файл test.py (test.exe) на него перетаскивают example.xml или ассоциируют с ним.
Мне казалось что файлу test.py (test.exe) файл example.xml передается как параметр, а далее он начинает обрабатывать. Или я не правильно все понимаю?



Офлайн

#4 Ноя. 13, 2012 08:41:45

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

qt4 ассоциация файлов

Patrik
а как исполняемый файл будет понимать, что на него перетащили или ассоциировали с ним файл.
Этим занимается операционная система и оболочка (Открыть с помощью… и т.п.)
Patrik
Мне казалось что файлу test.py (test.exe) файл example.xml передается как параметр, а далее он начинает обрабатывать.
В программе нужно будет обрабатывать аргументы командной строки:
http://docs.python.org/2/library/sys.html#sys.argv
http://docs.python.org/2.7/library/argparse.html
http://docs.python.org/2/library/optparse.html

Но в Qt есть особенность:
http://lateral.netmanagers.com.ar/weblog/posts/BB997.html

Офлайн

#5 Ноя. 13, 2012 14:00:13

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

qt4 ассоциация файлов

Попытка перегнать файл в exe не увенчалась успехом, cx-freeze выдал предупреждение:

Missing modules:
? ElementC14N imported from xml.etree.ElementTree
? _frozen_importlib imported from importlib



Офлайн

#6 Ноя. 15, 2012 11:07:21

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

qt4 ассоциация файлов

Скрипт не перегоняется в exe, так как у cx-freeze есть баг ((((((
http://sourceforge.net/p/cx-freeze/bugs/33/?page=2

В качестве аргумента командной строки у меня выступает имя файла
которое передается скрипту. Формат такой:
viewer.py test.xml

Написал так, если запускать из командной строки так:
viewer.pyw test.xml то все работает.
Если навести файл test.xml на viewer.pyw, то не работает.. точнее работает, как оказалось потом, но не так как должно. Просто он почему-то копирует файл xml не в папку, где лежит скрипт c:\viewer\, а в папку C:\WINDOWS\system32


# -*- coding: utf-8 -*-
import sys, os
from PyQt4 import QtCore, QtGui
from formviewer import Ui_MainWindow
import xml.etree.ElementTree as etree 
class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # или QWidget  QMainWindow
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setAcceptDrops(True)
        self.setupUi(self)
        QtCore.QObject.connect(self.action_2, QtCore.SIGNAL('triggered()'),QtGui.qApp, QtCore.SLOT('quit()'))
        QtCore.QObject.connect(self.action, QtCore.SIGNAL('triggered()'), self.showDialog)
		
	# обрабатываем параметры с коммандной строки
        try:
            input_file = sys.argv[1]
        except:
            input_file = None
        if input_file and input_file[-3:].upper() == "XML":
            tempXmlFile = os.path.basename(input_file) 
            shutil.copy(input_file, os.getcwd()) #копируем xml в папку со скриптом
            fileName = os.path.join(os.getcwd(), tempXmlFile)
            # отправляем на обработку в пассер
            self.showfile(fileName)	
          
    def showfile(self, fileName):
	# тут начинаем пассерить документ....



Офлайн

#7 Ноя. 15, 2012 11:50:18

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

qt4 ассоциация файлов

В данном случае на os.getcwd() опираться нельзя, нужно заменить на такое:

import os
import sys
 
def program_path():
    main_file = unicode(sys.argv[0], sys.getfilesystemencoding())
    return os.path.realpath(os.path.dirname(main_file))
В Python 3, не пробовал. Перекодирование вроде не нужно
return os.path.realpath(os.path.dirname(sys.argv[0]))

Офлайн

#8 Ноя. 15, 2012 12:09:57

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

qt4 ассоциация файлов

Пишет ошибку
Traceback (most recent call last):
File “C:/Viewer/test.py”, line 8, in <module>
print(program_path())
File “C:/Viewer/test.py”, line 5, in program_path
main_file = unicode(sys.argv, sys.getfilesystemencoding())
NameError: global name ‘unicode’ is not defined



Офлайн

#9 Ноя. 15, 2012 12:14:04

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

qt4 ассоциация файлов

Patrik
Пишет ошибку
Traceback (most recent call last):
File “CViewer/test.py”, line 8, in <module>
print(program_path())
File “CViewer/test.py”, line 5, in program_path
main_file = unicode(sys.argv, sys.getfilesystemencoding())
NameError: global name ‘unicode’ is not defined
Про Python 3 второй абзац прочитайте.

Офлайн

#10 Ноя. 15, 2012 14:04:00

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

qt4 ассоциация файлов

А как работать с путями где есть пробелы??
Если передать скрипту аргумент:
viewer.py С:\Мои документы\test.xml
то скрипт ломается (((



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version