スクリプトは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
:あなたは余分なステップを追加してもかまわない場合
Windowsは、Windows認可FSに「+ x」ファイルモードがないため、シバンを認識しません。 Windowsの観点からは、##Bobはあなたの叔父さんだと言うかもしれません。 – zwer
@zwer:まあ私の(確かに非常に)少し経験から(おそらく私はおそらくstackoverflow参照を見つけることができます)、あなたは間違っています。私のスクリプトからWindowsのシバン行を省略し、それをWindows上で実行しようとすると、見つからないライブラリやパスに見つからないpythonが返されます。私が行を戻すと、スクリプトは正常に動作します。 – zerohedge
Windowsでどのように実行していますか? CygwinのようなUnixエミュレータを使用していますか? – Barmar