我导入哪个库以在Python中使用create shortcut()?

时间:2012-04-04 17:43:46

标签: python python-3.x distutils

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

NameError: name 'create_shortcut' is not defined

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

EDIT 我应该早些说明我的最终目标和环境。我正在构建运行以下内容的.msi:     python setup.py bdist_msi --initial-target-dir =“C:\ path \ to \ install”--install-script =“install.py” install.py文件与setup.py位于同一目录中。

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

2 个答案:

答案 0 :(得分:0)

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

功能directory_createddirectory_createdcreate_shortcutstatic PyObject *CreateShortcut(PyObject *self, PyObject *args) {... 不是pythonic:例如,它们不能作为关键字 - 参数对调用 - 仅在位置上调用。这些函数在https://github.com/python/cpython/blob/master/PC/bdist_wininst/install.c

定义

shorcut创建的例程充当系统接口IShellLink的包装器("生活"在shell32.dll中)并从第504行开始:

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

然后在第643行链接:

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

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

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)

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

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

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

{{1}}

答案 1 :(得分:-2)

正如文件所说:

  

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

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

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

此文件需要放在setup.py文件的“脚本”部分。

  

在此上下文中特别有用的一些功能在安装脚本中可用作其他内置函数

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