Python

如何讓“realpath”找到我的符號連結?

  • February 27, 2020

我在 MacOSX 上使用bash我的 shell。我有符號連結,創建如下:

ln -s /usr/bin/python python2 

我有一個使用 python2 的包,我想在我目前的工作目錄中創建一個符號連結,/usr/bin/python它實際上是 python2。當我python2從命令行執行時,我收到此錯誤:

python2: realpath couldn't resolve "/usr/bin/python2"

但是像這樣呼叫它./python2可以正確解析路徑。我的PATH.。事實上,為了測試,我修改了它,只包含.在它裡面。

我該如何解決這個問題?謝謝!


語境

以下一些建議的解決方案對我不起作用。我試圖盡可能集中和簡短地提煉我的問題,以免人們淹沒在文本的海洋中,但顯然我需要提供更多背景資訊。

我正在嘗試在我從 git 複製的包上進行開發。原始包git-multimail是/是在 Linux 的某些變體上開發的(我猜是 Ubuntu)。**我一直在嘗試對其進行修改,以便能夠在 MacOSX 上使用它及其測試套件,並且盡可能少地進行修改。**這就是為什麼一些建議的解決方案並不理想的原因:

  1. **python2以 root身份在 /usr/bin/ 中創建一個符號連結。**我正在尋找一個不需要這個的解決方案。一開始這是一個明顯的選擇,但我想要一個盡可能少地修改主機系統的解決方案。這就是為什麼我想在目前工作目錄中創建一個臨時符號連結,將 CWD(即.)添加到我的路徑中,然後在完成後銷毀它(即符號連結)。
  2. **創建一個包裝腳本以使用現有的 python 呼叫 python 腳本。**這樣做的問題是,大部分測試套件都使用實際的 script_files 作為執行檔,這取決於 shebang 來找到正確的執行環境。這將意味著大量編輯測試套件。在這種情況下,(請參閱下面的測試框架片段),我必須為每個.py文件添加一個包裝器;此外,使用者/開發人員必須了解使用包的不同規則,具體取決於它們所在的系統(即在 MacOSX 上,確保在不通過包裝器或顯式呼叫的情況下不使用 python 文件/usr/bin/python file.py)。
#! /bin/sh

D=$(cd $(dirname "$0") && pwd)
MULTIMAIL="$D/../git-multimail/git_multimail.py"
POST_RECEIVE="$D/../git-multimail/post-receive"

TESTREPO=$("$D/create-test-repo")

HOME="$D"
XDG_CONFIG_HOME="$D"
GIT_CONFIG_NOSYSTEM=1
export HOME XDG_CONFIG_HOME GIT_CONFIG_NOSYSTEM

cd $TESTREPO

test_email() {
   REFNAME="$1"
   OLDREV="$2"
   NEWREV="$3"
   echo "$OLDREV" "$NEWREV" "$REFNAME" | USER=pushuser "$MULTIMAIL"

} 
  1. 將所有python2引用更改為python. 自述文件建議了這一點,但這實際上使版本控制變得無用,因為系統將更改視為新版本,而實際上它不是(語義上)。

我一直在使用(3),但我正在嘗試找到更好的解決方案。我願意接受這就是事情的本來面目(即,沒有合適的方式將“python2”指向/usr/bin/python它是可移植且不引人注目的,無需對測試套件和實際框架進行大量更改)。

我相信您與 Apple 用於管理和在同一程序的多個版本之間切換的系統發生衝突。您可以使用以下名為的腳本完成您想要的,不太優雅但沒有問題python2

#!/bin/bash
exec /usr/bin/python "$@"

讓它可執行 ( chmod +x python2),然後你就開始做生意了。

問題說明:

當您執行時,它會在同一目錄中/usr/bin/python查找並執行。您的符號連結失敗,因為系統遵循符號連結到,然後查找並找不到那裡。您可以通過使用“硬連結”而不是符號連結更進一步:python2.7 /usr/bin python2

rm python2
ln /usr/bin/python python2

現在沒有符號連結可循,只有同一個文件(inode)的兩個文件名。但現在我失敗了以下消息:

python2: posix_spawn: /Users/alexis/.../python22.7: No such file or directory

請注意python22.7:框架正在添加2.7到您創建的名稱中!與其試圖解開這個問題並建立一個符合其期望的連結森林,我建議您**遠離版本管理框架,**並使用上面建議的解決方案。

PS。可能有更好的解決方案:如果您要解釋開始時需要做什麼(為什麼需要提供python2的別名python),那麼有人可能會以不同的方式幫助您。這在 stackexchange 術語中被稱為“XY 問題”……

嘗試:

ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /usr/local/bin/python2

引用自:https://unix.stackexchange.com/questions/126540