双操作系统 Python 脚本中可互换的 shebang 行?
interchangeable shebang line in Python script for dual OSes?
脚本是在 OS X 和 Windows 上使用 virtualenv 开发的。所谓的开发人员已经使用requirements.txt
文件安装了所有需要的包,但仍然存在一个问题:
如果脚本是 运行 on OS X,每个 Python 文件的开头必须这样开始:
#!/Users/os-x-username/.virtualenvs/some_env/bin/python
#!C:\Users\windows-username\Envs\some_env\Scripts\python.exe
但是如果在Windows上开发,必须调换行序:
#!C:\Users\windows-username\Envs\some_env\Scripts\python.exe
#!/Users/os-x-username/.virtualenvs/some_env/bin/python
所谓的开发人员如何避免这种乏味?
如果您不介意添加额外的步骤,您可以创建一个启动器脚本 launcher.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
由于此脚本仅用于 运行 当前平台所需解释器中的 original_script_name.py
,因此它的 shebang 是什么并不重要 - 只要它选择任何 Python解释器就好了
它将作为原始脚本 (original_script_name.py
) 的直接替代品,因此只需调用 launcher.py
,如果需要,它甚至会重定向 CLI 参数。
脚本是在 OS X 和 Windows 上使用 virtualenv 开发的。所谓的开发人员已经使用requirements.txt
文件安装了所有需要的包,但仍然存在一个问题:
如果脚本是 运行 on OS X,每个 Python 文件的开头必须这样开始:
#!/Users/os-x-username/.virtualenvs/some_env/bin/python
#!C:\Users\windows-username\Envs\some_env\Scripts\python.exe
但是如果在Windows上开发,必须调换行序:
#!C:\Users\windows-username\Envs\some_env\Scripts\python.exe
#!/Users/os-x-username/.virtualenvs/some_env/bin/python
所谓的开发人员如何避免这种乏味?
如果您不介意添加额外的步骤,您可以创建一个启动器脚本 launcher.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
由于此脚本仅用于 运行 当前平台所需解释器中的 original_script_name.py
,因此它的 shebang 是什么并不重要 - 只要它选择任何 Python解释器就好了
它将作为原始脚本 (original_script_name.py
) 的直接替代品,因此只需调用 launcher.py
,如果需要,它甚至会重定向 CLI 参数。