問題の説明:

問題の説明:

私はMacOSXでbashシェルとして使用しています。次のように生成されたシンボリックリンクがあります。

ln -s /usr/bin/python python2 

/usr/bin/pythonpython2を使用するパッケージがあり、現在の作業ディレクトリ(実際にはpython2)にシンボリックリンクを作成したいと思います。python2コマンドラインから実行すると、次のエラーが発生します。

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

ただし、このように呼び出すと./python2パスが正しく解決されます。私はそれを私の中に持っていますPATH.実際にテストのために.その項目だけを含めるように修正しました。

この問題をどのように解決できますか?ありがとうございます!


コンテキスト

以下の提案された解決策のいくつかは私には適していませんでした。人々が馬の海に落ちないように、質問をできるだけ集中的かつ短く整理しようとしていますが、明らかにより多くの文脈を提供する必要があります。

Gitで複製されたパッケージを開発しようとしています。もともとパッケージはgit-multimailいくつかのLinuxバリアント(Ubuntuのようです)で開発されました。私は可能な限り最小限の修正でMacOSXでそれとテストスイートを使用できるように修正しようとしてきました。提案されたソリューションが理想的ではないいくつかの理由は次のとおりです。

  1. /usr/bin/にrootとしてpython2シンボリックリンクを作成します。これが不要なソリューションを探しています。当初は当然の選択でしたが、ホストシステムの変更ができるだけ少なく必要なソリューションを望んでいました。これが、現在の作業ディレクトリに一時シンボリックリンクを作成し、パスに.CWD(シンボリックリンクなど)を追加してから、完了したら、そのシンボリックリンク(シンボリックリンクなど)を削除する理由です。

  2. 既存のPythonを使用してPythonスクリプトを呼び出すラッパースクリプトを作成します。これの問題は、ほとんどのテストスイートが実際のscript_filesを実行可能ファイルとして使用し、正しい実行環境を見つけることはshebangに依存することです。これはテストスイートをたくさん編集することを意味します。この場合(以下のテストフレームワークの断片を参照)、各ファイルにラッパーを追加する必要があります.py。また、ユーザー/開発者は、使用しているシステムに応じてパッケージを使用するためのさまざまな規則を知っておく必要があります(MacOSXでは、makeラッパーを介して明示的に呼び出さずに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"
    
    } 
    
  3. すべてのpython2参照をpythonReadmeはこれをお勧めしますが、実際にはそうでない場合でも、システムは変更を新しいバージョンとして扱うため、バージョン管理は役に立ちません。

私は(3)を使ってきましたが、より良い解決策を見つけようとしています。私はこれが状況であることを喜んで受け入れます(つまり、/usr/bin/pythonテストスイートと実際のフレームワークを広範囲に変更せずに「python2」を移植可能で目に見えないことを指す適切な方法はありません)。

ベストアンサー1

私はあなたが同じプログラムの複数のバージョンを管理して切り替える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

従う必要があるシンボリックリンクはなく、同じファイル(インデックスノード)には2つのファイル名しかありません。ただし、次のメッセージで失敗します。

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

注:あなたが作成した名前にpython22.7フレームが追加されます!2.7この問題を解決しようとするのではなく、期待に応えるリンクフォレストを構築することをお勧めします。バージョン管理フレームワークから離れてください。上記で提案したソリューションを使用してください。

PS。より良い解決策があるかもしれません。実行する必要があること(および提供されたpython2エイリアスが必要な理由python)を説明できる場合は、他の人がそれを別の方法で実行するのに役立ちます。これをstackexchangeという用語では「XYの問題」といいます。

おすすめ記事