2

我正在尝试根据http://docs.python.org/distutils/builtdist.html#the-postinstallation-script在 Python 3.2 的安装后脚本中使用 create_shortcut() 函数。每次我尝试运行该函数时,我都会得到以下信息:

NameError: name 'create_shortcut' is not defined

我觉得我错过了一个导入,但我似乎无法在任何地方找到任何关于如何让它工作的文档。

编辑我应该早点指定我的最终目标和我的环境。我正在构建一个运行以下内容的 .msi: python setup.py bdist_msi --initial-target-dir="C:\path\to\install" --install-script="install.py" install.py 文件存在在与我的 setup.py 相同的目录中。

最终目标是拥有一个 .msi 文件,该文件将应用程序安装在指定目录中,并在指定位置创建开始菜单项。如果安装程序允许用户选择创建开始菜单快捷方式或桌面快捷方式,那就太好了。

4

2 回答 2

0

安装后脚本将在本机 Windows 安装例程中运行。

get_special_folder_path函数,和不是pythonic :例如directory_created,它们不能被称为关键字-参数对 - 只能在位置上。这些函数在https://github.com/python/cpython/blob/master/PC/bdist_wininst/install.c中定义directory_createdcreate_shortcut

用于创建快捷方式的例程充当系统接口IShellLink(shell32.dll 中的“lives”)的包装器,并从第 504 行开始:

static PyObject *CreateShortcut(PyObject *self, PyObject *args)
{...

然后在第 643 行链接:

PyMethodDef meth[] = {
    {"create_shortcut", CreateShortcut, METH_VARARGS, NULL},
    {"get_special_folder_path", GetSpecialFolderPath, METH_VARARGS, NULL},
  ...
};

在您的本地安装中,上述 C 代码已经在可执行文件中编译:

C:\Python26\Lib\distutils\command\wininst-6.0.exe
C:\Python26\Lib\distutils\command\wininst-7.1.exe
C:\Python26\Lib\distutils\command\wininst-8.0.exe
C:\Python26\Lib\distutils\command\wininst-9.0.exe
C:\Python26\Lib\distutils\command\wininst-9.0-amd64.exe

所以,回答:没有 python 库来导入函数 create_shortcut(),它只能在 Windows 安装后脚本中按原样使用。

如果您想同时支持自动和手动安装后方案,请查看 pywin32 解决方法:

https://github.com/mhammond/pywin32/blob/master/pywin32_postinstall.py第80行

try:
    create_shortcut
except NameError:
    # Create a function with the same signature as create_shortcut provided
    # by bdist_wininst
    def create_shortcut(path, description, filename,
                        arguments="", workdir="", iconpath="", iconindex=0):
        import pythoncom
        from win32com.shell import shell, shellcon

        ilink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None,
                                           pythoncom.CLSCTX_INPROC_SERVER,
                                           shell.IID_IShellLink)
        ilink.SetPath(path)
        ilink.SetDescription(description)
        if arguments:
            ilink.SetArguments(arguments)
        if workdir:
            ilink.SetWorkingDirectory(workdir)
        if iconpath or iconindex:
            ilink.SetIconLocation(iconpath, iconindex)
        # now save it.
        ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile)
        ipf.Save(filename, 0)
于 2018-05-11T21:56:30.927 回答
-2

正如文档所说:

从 Python 2.3 开始,可以使用 --install-script 选项指定安装后脚本。必须指定脚本的基本名称,并且脚本文件名也必须列在 setup 函数的 scripts 参数中

这些是仅限 Windows 的选项,您需要在构建模块的可执行安装程序时使用它。尝试:

python setup.py bdist_wininst --help
python setup.py bdist_wininst --install-script postinst.py --pre-install-script preinst.py

该文件需要进入 setup.py 文件的“脚本”部分。

在此上下文中特别有用的一些功能可作为安装脚本中的附加内置功能使用。

这意味着您不必导入任何模块。

于 2012-04-04T18:16:55.387 回答