我不是程序员,所以我甚至不知道我应该以什么方式提出这个问题。假设我编译了一个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
中的任何内容。我该怎么办?
答案 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>