我的python脚本的CX_Freeze - 修复模块错误?

时间:2014-08-02 20:03:10

标签: python cx-freeze

这是我的主要代码:

import turtle
import random
from sys import exit
import canvasvg
import os
import tempfile
import shutil
import cairosvg

red = 125
green = 70
blue = 38        
pen = 15
def runChk():
    runAgain = input("Would you like to return to menu? Y/N (N will exit) \n")
    if runAgain.upper() == "Y":
        print("Running...")
        turtle.clearscreen()
        start()
    elif runAgain.upper() == "N":
        print("Exiting...")
        exit()
    else:
        print("Invalid response.")
        runChk()

def saveImg():
    print("Done.")
    save = input("Would you like to save this tree? Y/N \n")
    if save.upper() == "Y":
        filename = input("What would you like to name it? \n")
        print("Ignore following warning...")
        if not filename.lower().endswith('.png'):
            filename += '.png'
        target_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'Images', filename)
        tmpdir = tempfile.mkdtemp()                   # create a temporary directory
        tmpfile = os.path.join(tmpdir, 'tmp.svg')    # name of file to save SVG to
        ts = turtle.getscreen().getcanvas()
        canvasvg.saveall(tmpfile, ts)
        with open(tmpfile) as svg_input, open(target_path, 'wb') as png_output:
            cairosvg.svg2png(bytestring=svg_input.read(), write_to=png_output)
        shutil.rmtree(tmpdir)     # clean up temp file(s)
        print("Saved!")
        runChk()
    elif save.upper() == "N":
        runChk()
    else:
        print("Invalid response. \n")
        saveImg()

def tree(branchLen, red, green, blue, pen):
    if branchLen > 3:
        pen = pen*0.8
        turtle.pensize(pen)
        if (red > 10 and green < 140):
            red = red - 15
            green = green + 8
    if branchLen > 5:
        angle = random.randrange(18, 55)
        angleTwo = 0.5*angle
        sub = (0.8*(random.randrange(1,20)))
        print("Angle 1: ", angle, "Angle 2: ", angleTwo, " Branch length subtracted by ", sub)
        turtle.color(red, green, blue)
        turtle.forward(branchLen)
        turtle.right(angleTwo)
        tree(branchLen-sub, red, green, blue, pen)
        turtle.left(angle)
        tree(branchLen-sub, red, green, blue, pen)
        turtle.right(angleTwo)
        turtle.backward(branchLen)
def main():
    turtle.colormode(255)
    turtle.bgcolor(102, 255, 255)
    turtle.left(90)
    turtle.up()
    turtle.speed(0)
    turtle.hideturtle()
    turtle.backward(440)
    turtle.down()
    print("Please wait while I draw...")
    tree(random.randrange(80, 95),red,green,blue, pen)
    turtle.update()
    saveImg()
def start():
    live = 1
    print("What would you like to do?\n")
    usr = input("Type 'run' to start a fractal. \nType 'run static' to create a fractal without live drawing (faster). \nOr 'exit' to exit. \n")
    if usr.upper() == "RUN":
        live = 1
        print("Running...")
        main()
    elif usr.upper() == "RUN STATIC":
        live = 0
        print("Running...")
        turtle.tracer(0)
        main()
    elif usr.upper() == "EXIT":
        print("Exiting...")
        exit()
    else:
        print("Invalid response.")
        start()
start()

它被称为fractal.py。我将那个和canvasvg复制到主python文件夹中。我创建了一个cx_freeze设置:

from cx_Freeze import setup, Executable
# NOTE: you can include any other necessary external imports here aswell

includefiles = [] # include any files here that you wish
includes = []
excludes = []
packages = ['turtle', 'random', 'sys', 'canvasvg', 'os', 'tempfile', 'shutil', 'cairosvg']

exe = Executable(
 # what to build
   script = "fractal.py", # the name of your main python script goes here 
   initScript = None,
   base = None, # if creating a GUI instead of a console app, type "Win32GUI"
   targetName = "Fractal Tree.exe", # this is the name of the executable file
   copyDependentFiles = True,
   compress = True,
   appendScriptToExe = True,
   appendScriptToLibrary = True,
   icon = None # if you want to use an icon file, specify the file name here
)

setup(
 # the actual setup & the definition of other misc. info
    name = "Fractal Tree", # program name
    version = "0.4.2",
    description = 'Creates a fractal tree',
    author = "TomSoft Programs",
    options = {"build_exe": {"excludes":excludes,"packages":packages,
      "include_files":includefiles}},
    executables = [exe]
)

当我以python setup.py build运行cmd时,我没有错误。我转到build文件夹并找到我的fractal.exe程序。它关闭得非常快,我无法得到完整的错误(因为快速关闭)但我知道它说的是:

ReferenceError: 'module' object has no attribute '_fix_up_module'

我该怎么做才能解决这个问题?我对python和cx_freeze很新,所以我确定我在setup.py中做错了。

1 个答案:

答案 0 :(得分:4)

对于任何发现此问题的人来说,这是cx_freeze的错误。你没有做错任何事。从here下载cx_freeze,该错误已在此下载位置修复。