2016-04-15 21 views
0

私は、Windows環境内で永続的なpythonスクリプトを作成しようとしています。私はPyInstallerを使ってexeファイルを作成しています。私はこのスクリプトをWindows XP環境でのみ動作させ、Windowsの他のバージョンでは動作させないようにしました。 exeを%temp%フォルダに移動することはできますが、レジストリ内の "Software \ Microsoft \ Windows \ CurrentVersion \ Run"には書き込まれません。私は皆さんにコードに関するあなたの意見をお伝えさせていただきたいと思います。レジストリに書き込むより効率的な方法はありますか?Pythonレジストリの永続性

import sys, base64, os, socket, subprocess 
from _winreg import * 

def autorun(tempdir, fileName, run): 
# Copy executable to %TEMP%: 
    os.system('copy %s %s'%(fileName, tempdir)) 

# Queries Windows registry for the autorun key value 
# Stores the key values in runkey array 
    key = OpenKey(HKEY_LOCAL_MACHINE, run) 
    runkey =[] 
    try: 
     i = 0 
     while True: 
      subkey = EnumValue(key, i) 
      runkey.append(subkey[0]) 
      i += 1 
    except WindowsError: 
     pass 

# If the autorun key "helloworld" isn't set this will set the key: 
    if 'helloworld' not in runkey: 
     try: 
      key= OpenKey(HKEY_LOCAL_MACHINE, run,0,KEY_ALL_ACCESS) 
      SetValueEx(key ,'helloworld',0,REG_SZ,r"%TEMP%\hello.exe") 
      key.Close() 
     except WindowsError: 
      pass 

def hello(): 
    print "hello world" 

def main(): 
    tempdir = '%TEMP%' 
    fileName = sys.argv[0] 
    run = "Software\Microsoft\Windows\CurrentVersion\Run" 
    autorun(tempdir, fileName, run) 
    hello() 

if __name__ == "__main__": 
     main() 

答えて

0

レジストリに書き込むことは、アプリケーションを管理者として実行する必要がある場合があることです。これは、異なる環境で異なるパフォーマンスを持つ理由となります。

レジストリに厳密にバインドされていない場合は、pickleを使用してセッション間で情報を保存してみることができます。これはクロスプラットフォームの利点があります。

+0

フィードバックに感謝します。私は実際にHKEY_LOCAL_MACHINEをHKEY_CURRENT_USERに変更するだけで、実際にこの問題を解決しました。私は新しい問題がある。何らかの理由で自動的に起動しません。 – holograms

+0

私はそれが働くように気にしません。 thanks – holograms

0

この問題は、HKEY_LOCAL_MACHINEの値をHKEY_CURRENT_USERに置き換えて解決しました。私はまだ再起動後に実行されていない.exeファイルに問題があります。

+0

'%TEMP%'環境変数をWindowシェルに展開させるためにデータ型として 'REG_EXPAND_SZ'を使います。ただし、パスをレジストリに書き込む前に展開することをおすすめします(例: 'os.environment [" TEMP "]、" hello.exe ")'。 'HKLM'ではなく' HKCU'に固執してください。他のユーザは現在のユーザの一時ディレクトリにアクセスすることはできません。 – eryksun

+0

これは間違いなくフルパスで見栄えがよくなりますが、それでも自動実行はできません。私はなぜ=( – holograms

+0

両方の呼び出しで 'HKCU'を使用していますか?' fileName'やハードコーディング 'hello.exe'の値を保存していますか?コピーは成功しましたか?[' shutil.copy'](https://docs.python.org/2/library/shutil.html#shutil.copy)をcmdシェルの代わりに使用しますが、cmdを使用した場合、スペースの場合は引用符を使用します – eryksun