2017-12-06 14 views
0

スクリプトはOS XとWindowsの両方でvirtualenvを使って開発されています。いわゆる開発者がすでにrequirements.txtファイルを使用して、すべての必要なパッケージをインストールしましたが、一つの問題が残っている:デュアルOS用のPythonスクリプトで交換可能なシバンライン?

#!/Users/os-x-username/.virtualenvs/some_env/bin/python 
#!C:\Users\windows-username\Envs\some_env\Scripts\python.exe 
:スクリプトは、OS X上で実行されている

場合は、それぞれのPythonのファイルの先頭は次のように開始する必要があります

しかし、Windows上で開発した場合、行の順序を切り替える必要があります:

#!C:\Users\windows-username\Envs\some_env\Scripts\python.exe 
#!/Users/os-x-username/.virtualenvs/some_env/bin/python 

方法、いわゆる開発者は、この退屈を避けることができますか?このスクリプトは、現在のプラットフォームのために必要な通訳でoriginal_script_name.pyが実行することですので、それを

#!/usr/bin/env python 

import subprocess 
import sys 

if __name__ != "__main__": 
    print("This is a launcher. Please run only as a main script.") 
    exit(-1) 

INTERPRETERS = { 
    "win": r"C:\Users\windows-username\Envs\some_env\Scripts\python.exe", # Windows 
    "darwin": "/Users/os-x-username/.virtualenvs/some_env/bin/python", # OSX 
    "linux": "/home/linux-user/.virtualenvs/some_env/bin/python" # Linux 
    # etc. 
} 

TARGET_SCRIPT = "original_script_name.py" 

interpreter = None 
for i in INTERPRETERS: # let's find a suitable interpreter for the current platform 
    if sys.platform.startswith(i): 
     interpreter = i 
     break 
if not interpreter: 
    print("No suitable interpreter found for platform:", sys.platform) 
    exit(-1) 

main_proc = subprocess.Popen([interpreter, TARGET_SCRIPT] + sys.argv[1:]) # call virtualenv 
main_proc.communicate() # wait for it to finish 

exit(main_proc.poll()) # redirect the return code 

:あなたは余分なステップを追加してもかまわない場合

+1

Windowsは、Windows認可FSに「+ x」ファイルモードがないため、シバンを認識しません。 Windowsの観点からは、##Bobはあなたの叔父さんだと言うかもしれません。 – zwer

+0

@zwer:まあ私の(確かに非常に)少し経験から(おそらく私はおそらくstackoverflow参照を見つけることができます)、あなたは間違っています。私のスクリプトからWindowsのシバン行を省略し、それをWindows上で実行しようとすると、見つからないライブラリやパスに見つからないpythonが返されます。私が行を戻すと、スクリプトは正常に動作します。 – zerohedge

+0

Windowsでどのように実行していますか? CygwinのようなUnixエミュレータを使用していますか? – Barmar

答えて

1

、OUのようなランチャースクリプトlauncher.pyを作成することができますそのシバンが何であるかは関係ありません。Pythonインタプリタを選ぶ限り、それは問題ありません。

元のスクリプト(original_script_name.py)の代替として機能するので、代わりにlauncher.pyを呼び出すだけで、必要に応じてCLI引数をリダイレクトします。

+0

あなたの答えについて私が理解していない唯一の事は最初の文です。私は本当に余分なステップを実際に見ていない! pyファイルの代わりにこのpyファイルを実行するだけです。大きなありがとう! – zerohedge

関連する問題