Форум сайта python.su
Написал xml пассер, хочу в Windows сделать ассоциацию xml файлов со
своим пассером или просто открыть в пассере xml при наведении на python-скрипт, подскажите как это можно сделать?
Если я правильно понимаю, чтобы работала ассоциация, нужно передавать
имя файла как параметр python-скрипту и дальше с ним как-то работать.
Офлайн
Вроде, самое простое - это сделать *.exe файл, например, с помощью cx-freeze
Офлайн
Хорошо сделаю exe файл, а как исполняемый файл будет понимать, что на него перетащили или ассоциировали с ним файл.
Разве это не так работает? к примеру исполняемый файл test.py (test.exe) на него перетаскивают example.xml или ассоциируют с ним.
Мне казалось что файлу test.py (test.exe) файл example.xml передается как параметр, а далее он начинает обрабатывать. Или я не правильно все понимаю?
Офлайн
PatrikЭтим занимается операционная система и оболочка (Открыть с помощью… и т.п.)
а как исполняемый файл будет понимать, что на него перетащили или ассоциировали с ним файл.
PatrikВ программе нужно будет обрабатывать аргументы командной строки:
Мне казалось что файлу test.py (test.exe) файл example.xml передается как параметр, а далее он начинает обрабатывать.
Офлайн
Попытка перегнать файл в exe не увенчалась успехом, cx-freeze выдал предупреждение:
Missing modules:
? ElementC14N imported from xml.etree.ElementTree
? _frozen_importlib imported from importlib
Офлайн
Скрипт не перегоняется в 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): # тут начинаем пассерить документ....
Офлайн
В данном случае на 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))
return os.path.realpath(os.path.dirname(sys.argv[0]))
Офлайн
Пишет ошибку
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
Офлайн
PatrikПро Python 3 второй абзац прочитайте.
Пишет ошибку
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
Офлайн
А как работать с путями где есть пробелы??
Если передать скрипту аргумент:
viewer.py С:\Мои документы\test.xml
то скрипт ломается (((
Офлайн