扩展已编译的Python脚本的功能

时间:2016-01-22 11:59:01

标签: python

我不是程序员,所以我甚至不知道我应该以什么方式提出这个问题。假设我编译了一个Python脚本以生成.exe(我使用py2exe来执行此操作)。这是主要计划。现在,我想为它添加一些额外的功能,但我不想用添加的功能重新编译整个脚本。我试图在网上搜索一些东西,然后我找到了用Python脚本扩展C ++或其他应用程序的例子(比如一种插件)。但我无法弄清楚如何使用已经用Python编写的应用程序来实现它。

我试过这个:我写了major.py(这是我构建可执行文件的脚本)和stuff.py。在major我写了这个:

def generic():
    import stuff
    while True:
        param=input('what did you say? ')
        stuff.speak(param)

generic()

stuff我写了这个:

def speak(param):
    print(param)

然后我用py2exe创建了一个.exe。它按预期工作,当我在命令行中运行程序时说“你说的是什么?”并等到我输入内容,然后打印我输入的内容。 然后,我用这个改变了stuff.py

def speak(param):
    print('I said '+param)

希望现在执行之前创建的.exe会打印“我说...”以及我输入的内容。显然,它不起作用,程序继续像以前一样。所以我猜测,一旦我导入stuff并创建.exe文件,该导入就是永久性的,不允许我更改stuff中的任何内容。我该怎么办?

3 个答案:

答案 0 :(得分:3)

py2exe将已编译的脚本打包在可执行文件中。

您需要重新创建可执行文件(将重新编译任何已更改的脚本)以查看更改是否生效。

编辑后评论: 如果从可执行文件中动态导入/重新导入模块,则可以执行此操作。

在您的主脚本中(见下面的代码)

mod, error = loadmodule('mystuff.py')

if mod is not None:
    # loading succeeded you can now proceed and do things with it
    pass

当然,您必须将mystuff.py的脚本中的py2exe保留在可执行文件中。在上面的示例中,mystuff.py将与可执行文件位于同一目录中。

加载代码:

def loadmodule(modpath, modname=''):

    if not modpath.endswith('.py'):
        modpath += '.py'

    # generate a random name for the module
    if not modname:
        modpathbase = os.path.basename(modpath)
        modname, _ = os.path.splitext(modpathbase)

    version = (sys.version_info[0], sys.version_info[1])

    if version < (3, 3):
        mod, e = loadmodule2(modpath, modname)
    else:
        mod, e = loadmodule3(modpath, modname)

    return mod, e


def loadmodule2(modpath, modname):
    import imp

    try:
        mod = imp.load_source(modname, modpath)
    except Exception as e:
        return (None, e)

    return (mod, None)


def loadmodule3(modpath, modname):
    import importlib.machinery

    try:
        loader = importlib.machinery.SourceFileLoader(modname, modpath)
        mod = loader.load_module()
    except Exception as e:
        return (None, e)

    return (mod, None)

答案 1 :(得分:1)

如果从Python运行脚本,而不是将其编译为可执行文件,则可以进行更改并运行它们而无需重新编译。 py2exe主要用于允许您将应用程序分发给其他未安装Python的Windows计算机。完成开发后,将其编译为可执行文件,以便在其他计算机上运行。

答案 2 :(得分:1)

没有办法做你想做的事。 py2exe构建了一个独立的python解释器(在名为python.dll的文件中),只包含项目的依赖项。然后.exe文件使用该解释器运行您的脚本

我建议你,如果你真的需要提供定期升级,那么你应该重新编译它,或者在目标机器上安装python,或者做一个更新例程来检查更新并在目标机器中编译它(使用py2exe)< / p>