TheLostJedi Ответов: 1

Скрипт Python аварийно завершает работу при вызове из второго скрипта


У меня есть скрипт генерации отчетов (назовем его A), который генерирует отчет в формате PDF. Я хочу импортировать это в новый скрипт (скрипт B) и вызывать функции из этого нового скрипта.

Проблема:

1. Скрипт аварийно завершает работу при вызове из скрипта Б именно на создание объекта QPixmap. Консоль Python перезапускается.
2. скрипт а работает нормально, когда он запускается сам по себе, но если я попытаюсь вызвать его из командной строки python.exe аварии.

Я объясню и покажу код в следующем разделе, поскольку лучшее, что мне удалось сделать, - это определить проблемы.

Что я уже пробовал:

Ниже приведен сценарий В. Все, что он делает, это импортирует скрипт A, создает экземпляр класса, определенного в A, и использует его для вызова метода этого объекта.

import Script A as et

a = "sample"
mdbPath = "C:\\Python27\\test.mdb"
directory = "C:\\Python27"

ui = et.HawkAutomationScript()
ui.Main(mdbPath,directory,a)


Сценарий А содержит определение класса с именем HawkAutomationScript Этот объект содержит две функции, которые следует отметить: одну основную функцию и одну функцию для создания отчета. Это импортированные модули:

from random import*
import sys
import os
import subprocess
import time
from datetime import datetime
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import QRect
from PyQt4.QtGui import QTextDocument, QPrinter, QApplication, QPainter
from string import Template
import shutil
import time
import pyodbc


Это определение класса и основной функции:

doc = QTextDocument()
myCursor = QtGui.QTextCursor(doc)

class HawkAutomationScript(object):
    def Main(self,mdb,directory,name):
            Ui_FormObject = HawkAutomationScript()
##          Filling in the Report         ##
            Ui_FormObject.fnGenerateReport(directory,name)


def fnGenerateReport(self,directory,name):
        now = datetime.now()
        dateString = now.strftime("%d-%b-%Y") 							# For getting Current Date
        dirPath = "C:\\Users\\michael\\Downloads\\Ethernet\\scripts\\"
        
        ResultName = "SelfTest_Results"
        testName = name+".pdf"
        subDirPath = dirPath + name
        if(os.path.isdir(dirPath)):
                if(os.path.isdir(subDirPath)):
                        subDirPath = subDirPath + testName
                else:
                        os.mkdir(subDirPath)
                        subDirPath = subDirPath + testName
        else:
                os.mkdir(dirPath)
                os.mkdir(subDirPath)
                subDirPath = subDirPath + testName
        pixmap = QtGui.QPixmap(doc.size().width(), doc.size().height()) ################
        printer = QPrinter()
        
        printer.setOutputFileName(subDirPath)
        printer.setOutputFormat(QPrinter.PdfFormat)
        
        doc.print_(printer)
        # Create a QPainter to draw our content    
        painter = QPainter(pixmap)
        painter.begin( printer )
        doc.drawContents(painter)
        painter.end() 


Это все соответствующий код.

Если я запускаю скрипт B, A вылетает в строке QPixmap, отмеченной в коде. Но если я копирую строки из B и выполнить самостоятельно, отчет в формате PDF создается. Но если я запускаю A сам по себе из командной строки python.exe аварии.

Любая помощь будет очень признательна. Спасибо!!

Richard MacCutchan

Не знаю точно, в чем проблема, но одна очевидная проблема заключается в том, что dirPath и subDirPath оба они указывают на один и тот же каталог, когда вы звоните mkdir.

TheLostJedi

Спасибо Вам за ответ! Я этого не заметил. subDirPath предполагалось, что все будет по-другому. Но в этом случае каталог существует. Так что, хотя это могло бы вызвать проблему позже, прямо сейчас она выходит из-под контроля. if блок без каких-либо проблем, но выходит из строя после QPixmap заявление. Меня смущает тот факт, что это происходит только при вызове из другого скрипта. В любом случае спасибо!

Richard MacCutchan

Я не вижу ничего плохого, но у меня нет опыта использования Qt из Python. Я могу только предложить использовать отладчик, чтобы попытаться захватить больше информации.

1 Ответов

Рейтинг:
2

Richard MacCutchan

Следующий код кажется мне неправильным:

dirPath = "C:\\Users\\michael\\Downloads\\Ethernet\\scripts\\"

ResultName = "SelfTest_Results"
testName = name+".pdf"
subDirPath = dirPath    # this is now the same as dirPath
if(os.path.isdir(dirPath)):
        if(os.path.isdir(subDirPath)): # if both paths (actually only one) exists
                subDirPath = subDirPath + testName  # append testName, but see below
        else: // this can never happen
                os.mkdir(subDirPath)
                subDirPath = subDirPath + testName
else:
        os.mkdir(dirPath)  # dirPath did not exist, so create it
        os.mkdir(subDirPath) # now create it again ???
        subDirPath = subDirPath + testName # now append testName, but it's too late.


[редактировать]
Какой она должна быть:
dirPath = "C:\\Users\\michael\\Downloads\\Ethernet\\scripts\\"

ResultName = "SelfTest_Results"
testName = name+".pdf"
subDirPath = dirPath + name  # append name, testName is the name of the PDF file
if(!os.path.isdir(dirPath)):
    os.mkdir(dirPath)  # dirPath did not exist, so create it
if(!os.path.isdir(subDirPath)): # subDirPath did not exist, so create it
    os.mkdir(subDirPath)

...


[/редактировать]


TheLostJedi

Я внес необходимые изменения, хотя это не влияет на код, если dirPath существует.

Richard MacCutchan

Независимо от того, существует он или нет, в приведенном выше коде dirPath и subDirPath всегда будут одинаковыми при вызове mkdir.

TheLostJedi

Я внес изменения в приведенный выше код. Но в моей тестовой установке каталог уже существует. Так mkdir никогда не вызывается. subDirPath просто стать subDirPath + testName Я изменил это в основном коде.

Richard MacCutchan

Смотрите мое обновление выше.