管理者としてのPythonスクリプトの実行

私はpy2exeを使用してインストーラを書いています。これは、さまざまなファイル操作を実行する権限を持つために管理者で実行する必要があります。私はセットアップファイルを作成するpy2exeに付属のuser_access_controlsディレクトリからいくつかのサンプルコードを変更しました。私は自分のコンピュータ上で実行すると、生成されたexeファイルがうまく動作します。しかし、私はPythonがインストールされていないコンピュータ上でexeを実行しようとすると、私はインポートモジュール(この場合はshutilとos)が存在しないと言うエラーを取得します。 py2exeが自動的にすべてのファイルの依存関係をexeにラップするのは私の印象でしたが、そうではないと思います。 py2exeは、すべてのPythonモジュールを含むライブラリというzipファイルを生成しますが、生成されたexeファイルでは使用されていないようです。基本的に私の質問は、py2exeで生成されたexeファイルにインポートを含めるにはどうすればいいですか?おそらく私のsetup.pyファイルに変更を加える必要があります - このコードは次のとおりです:

from distutils.core import setup
import py2exe

# The targets to build
# create a target that says nothing about UAC - On Python 2.6+, this
# should be identical to "asInvoker" below.  However, for 2.5 and
# earlier it will force the app into compatibility mode (as no
# manifest will exist at all in the target.)
t1 = dict(script="findpath.py",
          dest_base="findpath",
          uac_info="requireAdministrator")
console = [t1]

# hack to make windows copies of them all too, but
# with '_w' on the tail of the executable.
windows = [{'script': "findpath.py",
            'uac_info': "requireAdministrator",
            },]

setup(
    version = "0.5.0",
    description = "py2exe user-access-control",
    name = "py2exe samples",
    # targets to build
    windows = windows,
    console = console,
    )
1
ファイルのフォルダ全体を使用していますか? .exeと.zipをコピーするだけでは不十分です。
追加された 著者 Gringo Suave,
はい、私は "dist"フォルダ全体をコピーしています。
追加された 著者 Ben,

2 答え

設定セクションで options = {'py2exe':{'bundle_files':1}}、 zipfile = None を設定してください。 Pythonは依存関係のない単一の.exeファイルを作成します。例:

from distutils.core import setup
import py2exe

setup(
    console=['watt.py'],
    options={'py2exe': {'bundle_files': 1}},
    zipfile = None
)
2
追加された
ええ、私はそれを知らなかった。 Win64では、bundle_files <3の場合は文句を言います。ソース\ MemoryModule.cのコードがwin64では動作しないため、これはまだサポートされていません。ここ
追加された 著者 alexey,
python setup.py py2exe と入力して、ファイルsetup.pyを使用しました。 print( "Hello World!")/code> watt.exeに依存しています。 msvcr90.dllとkernel32.dllのみに依存します。同じ結果が得られるように手順を繰り返してください。
追加された 著者 alexey,
私は実験を行い、バンドルファイルは必要だが十分ではないと思うが、 zipfile = None も必要と思われる。 zipfile = None を設定しないと、exeファイルのサイズが実際に小さくなり、依存関係に問題があります。それに応じて初期回答が編集されます。
追加された 著者 alexey,
Watt.pyは print( "Hello World!")の1行です。ところで、exeファイルサイズは少なくとも数メガバイトでなければなりません。
追加された 著者 alexey,
追加された 著者 alexey,
ベン、コメントの議論を避ける必要がある。チャットに行きましょう。ここ
追加された 著者 alexey,
それは "win64でまだサポートされていないバンドルファイル1"と言われています - すべての32ビット版を試してインストールし、何が起こるか見てみましょう
追加された 著者 Ben,
うーん、それはまだpythonがインストールされているコンピュータでのみ動作します。唯一の違いは、今すぐスローされたエラーメッセージがないことです。あたかもすべてがうまくいっても何もしないかのように動きます。バンドルされたファイルにまだファイルの依存関係が含まれていないと思われます。
追加された 著者 Ben,
"watt.py"のコードを投稿できますか?私が参照している依存関係は、dllではなく、Pythonモジュールです。明確にするために、私のコンピュータ上ではすべて正常に動作します。問題は、Pythonを使用しないでコンピュータで実行しようとする場合にのみ発生します。
追加された 著者 Ben,

私はあなたのためにあなたのセットアップスクリプトを書き換えます。これはうまくいく

from distutils.core import setup
import py2exe

# The targets to build
# create a target that says nothing about UAC - On Python 2.6+, this
# should be identical to "asInvoker" below.  However, for 2.5 and
# earlier it will force the app into compatibility mode (as no
# manifest will exist at all in the target.)
t1 = dict(script="findpath.py",
          dest_base="findpath",
          uac_info="requireAdministrator")
console = [t1]

# hack to make windows copies of them all too, but
# with '_w' on the tail of the executable.
windows = [{'script': "findpath.py",
            'uac_info': "requireAdministrator",
            },]

setup(
    version = "0.5.0",
    description = "py2exe user-access-control",
    name = "py2exe samples",
    # targets to build
    windows = windows,
    console = console,
    #the options is what you fail to include it will instruct py2exe to include these modules explicitly
    options={"py2exe":
               {"includes": ["sip","os","shutil"]}
              }
    )
0
追加された