
私はMacOSXでbash
シェルとして使用しています。次のように生成されたシンボリックリンクがあります。
ln -s /usr/bin/python python2
/usr/bin/python
python2を使用するパッケージがあり、現在の作業ディレクトリ(実際にはpython2)にシンボリックリンクを作成したいと思います。python2
コマンドラインから実行すると、次のエラーが発生します。
python2: realpath couldn't resolve "/usr/bin/python2"
ただし、このように呼び出すと./python2
パスが正しく解決されます。私はそれを私の中に持っていますPATH
。.
実際にテストのために.
その項目だけを含めるように修正しました。
この問題をどのように解決できますか?ありがとうございます!
コンテキスト
以下の提案された解決策のいくつかは私には適していませんでした。人々が馬の海に落ちないように、質問をできるだけ集中的かつ短く整理しようとしていますが、明らかにより多くの文脈を提供する必要があります。
Gitで複製されたパッケージを開発しようとしています。もともとパッケージはgit-multimail
いくつかのLinuxバリアント(Ubuntuのようです)で開発されました。私は可能な限り最小限の修正でMacOSXでそれとテストスイートを使用できるように修正しようとしてきました。提案されたソリューションが理想的ではないいくつかの理由は次のとおりです。
/usr/bin/にrootとして
python2
シンボリックリンクを作成します。これが不要なソリューションを探しています。当初は当然の選択でしたが、ホストシステムの変更ができるだけ少なく必要なソリューションを望んでいました。これが、現在の作業ディレクトリに一時シンボリックリンクを作成し、パスに.
CWD(シンボリックリンクなど)を追加してから、完了したら、そのシンボリックリンク(シンボリックリンクなど)を削除する理由です。既存の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" }
すべての
python2
参照をpython
。Readmeはこれをお勧めしますが、実際にはそうでない場合でも、システムは変更を新しいバージョンとして扱うため、バージョン管理は役に立ちません。
私は(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の問題」といいます。
答え2
努力する:
ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /usr/local/bin/python2
答え3
シンボリックリンクを解決(または調査)する必要がある場合は、プラットフォームに依存しないbashライブラリ「realpath-lib」を使用できます。デフォルトでは、readlinkをエミュレートし、MacまたはUnixで実行できます。以下で見つけることができます:ジタブまたはビットバケットそしてそれは無料です。
しかし、ローカル(作業)ディレクトリ(./python2ではない)でのみpython2を実行したいようです。これは、.bashrcのエイリアスを使用して行うことができます。それ以外の場合は、作業ディレクトリ(シンボルリンクを含む)をPATH環境変数に追加する必要があります。現在のセッションに対してのみこれを実行することも、将来のセッションのために.bashrcファイルで実行することもできます。これは特定のユーザーに固有のソリューションです。
すべてのユーザーが使用できるもう1つのオプションは、パスの別のディレクトリ(/usr/local/binなど)に/usr/bin/pythonを指すpython2シンボリックリンクを作成することです。たぶん、次のようなものがあります。
sudo ln -s /usr/bin/python /usr/local/bin/python2
その後、すべてのユーザーまたはスクリプトがpythonまたはpython2コマンドを見つける必要があります。もちろん、このオプションをインストールするには管理者(root)権限が必要です。
答え4
Unix コマンドを使用してreadlink
リンクの物理パスを検索できます。
はい
次のリンクがあるとしましょう。
$ ls -l /usr/bin/etags
lrwxrwxrwx. 1 root root 29 Dec 10 22:56 /usr/bin/etags -> /etc/alternatives/emacs.etags
$ ls -l /etc/alternatives/emacs.etags
lrwxrwxrwx. 1 root root 20 Dec 10 22:56 /etc/alternatives/emacs.etags -> /usr/bin/etags.ctags
$ ls -l /usr/bin/etags.ctags
lrwxrwxrwx. 1 root root 5 Dec 10 22:56 /usr/bin/etags.ctags -> ctags
シンボリックリンクが指す値を見つける
$ readlink /usr/bin/etags /etc/alternatives/emacs.etags
メモ:上記の結果は別のリンクかもしれません。この問題を解決するには、以下の#2を参照してください。
シンボリックリンクが指す値の絶対パスを見つける
$ readlink -f /usr/bin/etags /usr/bin/ctags