簡體   English   中英

強大的Python3 shebang線?

[英]Robust Python3 shebang line?

有沒有辦法編寫 shebang 行,以便它可以找到 Python3 解釋器(如果存在)?

天真地,從PEP 394我希望#!/usr/bin/env python3應該工作。

但是,我注意到在某些python是 Python3 的系統上,它們不提供python3別名。 在這些系統上,您需要使用#!/usr/bin/env python來獲取 Python3。

有沒有一種強有力的方法來處理這種歧義? 有沒有辦法編寫shebang行,以便它在存在時使用python3 ,但如果沒有,請嘗試使用python (要求最終用戶手動修復他們的系統以添加python3別名並不理想。)

我能看到的唯一方法是提供您自己的shebang包裝器來調用正確版本的python。 如果您可以可靠地將包裝器放置在設定的位置,您可以執行以下操作:

創建包裝腳本,例如 /usr/local/bin/python3_wrapper

#!/bin/bash
cmd="$1"
shift
if which python3 >/dev/null; then
  exec python3 "$cmd" "$@"
elif which python >/dev/null; then
  version=$(python --version 2>&1 | cut -d' ' -f2 | cut -d. -f1)
  if [[ "$version" == "3" ]]; then
    exec python "$cmd" "$@"
  else
    echo "python is version $version (python3 not found)"
  fi
else
  echo "python3 nor python found"
fi
exit 1

然后在腳本中使用以下shebang:

#!/usr/local/bin/python3_wrapper

您的另一個選擇是調用一個適用於版本 2 和版本 3 的 python 腳本,然后使用正確的可執行文件調用您的 python3 腳本。 如果您的腳本名為 script.py,則將其重命名為 script.py3 並按如下方式創建 script.py:

#!/usr/bin/env python

import os
import sys

if sys.version_info.major == 3:
    exe = "python"    # python is version 3.x
else:
    exe = "python3"   # python is not version 3.x so try python3
try:
    os.execvp(exe, [exe, sys.argv[0]+'3'] + sys.argv[1:])
except:
    print(exe, "not found")
sys.exit(1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM