2

http://docs.python.org/distutils/builtdist.html#the-postinstallation-scriptに従って、Python 3.2 のインストール後のスクリプトで create_shortcut() 関数を使用しようとしています。関数を実行しようとするたびに、次のようになります。

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 ファイルを作成することです。インストーラーで、ユーザーが [スタート] メニューのショートカットまたはデスクトップのショートカットの作成を選択できるようにすると便利です。

4

2 に答える 2

0

インストール後のスクリプトは、ネイティブの Windows インストール ルーチンで実行されます。

Fuctions get_special_folder_pathdirectory_createddirectory_createdおよびcreate_shortcutは pythonic ではありません。たとえば、キーワードと引数のペアとして呼び出すことはできません。位置的にのみです。関数はhttps://github.com/python/cpython/blob/master/PC/bdist_wininst/install.cで定義されています

ショートカットを作成するためのルーチンは、システム インターフェイス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

したがって、答え: 関数 create_shortcut() をインポートするための python lib はありません。これは、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オプションで指定できます。スクリプトのベース名を指定する必要があります。また、スクリプトのファイル名も、セットアップ関数の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 に答える