gpoore / text2qti

Create quizzes in QTI format for Canvas from Markdown-based plain text
BSD 3-Clause "New" or "Revised" License
173 stars 62 forks source link

: Can't generate .pdf versions of quizzes: UnboundLocalError: local variable 'proc' referenced before assignment #47

Closed mikegilchrist closed 2 years ago

mikegilchrist commented 2 years ago

I'm using text2qti 0.6.0.dev5 which I installed from github. I can create the QTI .zip files from my .md files, but when trying to create .pdf versions of my quizzes, I get the following error

$ text2qti --solutions test.pdf test.md
Traceback (most recent call last):
  File "/home/user/.local/lib/python3.7/site-packages/text2qti-0.6.0.dev5-py3.7.egg/text2qti/cmdline.py", line 144, in main
  File "/home/user/anaconda3/lib/python3.7/subprocess.py", line 512, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['pandoc', '-f', 'markdown', '-o', '/tmp/test.pdf']' returned non-zero exit status 43.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/user/.local/bin/text2qti", line 11, in <module>
    load_entry_point('text2qti==0.6.0.dev5', 'console_scripts', 'text2qti')()
  File "/home/user/.local/lib/python3.7/site-packages/text2qti-0.6.0.dev5-py3.7.egg/text2qti/cmdline.py", line 147, in main
UnboundLocalError: local variable 'proc' referenced before assignment

I get the same behavior if I use the --only-solutions option.

I've looked at the code in text2qti/cmdline.py, but can't see why it's a problem. This seems to be the relevant code

                if solutions_path.suffix.lower() == '.pdf':
                    if not shutil.which('pandoc'):
                        raise Text2qtiError('Exporting solutions in PDF format requires Pandoc (https://pandoc.org/)')
                    if not shutil.which('pdflatex'):
                        raise Text2qtiError('Exporting solutions in PDF format requires LaTeX (https://www.tug.org/texlive/ or https://miktex.org/)')
                    if platform.system() == 'Windows':
                        cmd = [shutil.which('pandoc'), '-f', 'markdown', '-o', str(solutions_path)]
                    else:
                        cmd = ['pandoc', '-f', 'markdown', '-o', str(solutions_path)]
                    try:
                        proc = subprocess.run(
                            cmd,
                            input=solutions_text,
                            capture_output=True,
                            check=True,
                            encoding='utf8'
                        )
                    except subprocess.CalledProcessError:
                        raise Text2qtiError(f'Pandoc failed:\n{"-"*78}\n{proc.stderr}\n{"-"*78}')

Here's my test file

% For use with text2qti
Quiz title: Test file
Quiz description: Simple test file for text2qti

% Khan Academy

Title: Key Components of TF Regulation
Points: 8
1. Describe and differentiate between they key components of TF regulation systems: Activators, Repressors, Silencers, and Enhancers.
   Be sure to indicate which are made of DNA and which are made of protein.
... TF are made of protein while elements are made of DNA.
    Activators are TF that bind enhancer elements to promote the transcription of a gene.
    In contrast, repressors are TF that bind to silencer elements which prevent gene transcription.
___

I apologize if this is really a user error, but do appreciate the package. It's very helpful

gpoore commented 2 years ago

There's a bug in the error handling code that is invoked when Pandoc fails. Currently, the error message is using proc.stderr, but there are failure modes where proc never gets defined. I'll have to reorganize this a little.

In terms of why Pandoc is failing, my guess would be that there are missing LaTeX packages. text2qti needs everything that Pandoc usually requires, plus fontawesome. Until the bug is fixed, you might try creating solutions in md format, and then try to convert that to PDF to see if Pandoc will provide additional details.

mikegilchrist commented 2 years ago

Thanks for the work around. It takes care of my issue.

mikegilchrist commented 2 years ago

Update: Problem disappears if you use a more recent version of pandoc, such as 2.16.2