문제 설명:

문제 설명:

저는 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참조를 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

이제 따라야 할 심볼릭 링크는 없으며 동일한 파일(인덱스 노드)에 대해 두 개의 파일 이름만 있습니다. 하지만 이제 다음 메시지와 함께 실패합니다.

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

참고 : 귀하가 만든 이름에 python22.7프레임이 추가됩니다 ! 2.7이 문제를 해결하려고 하지 말고 기대에 부응하는 링크 포리스트를 구축하는 것이 좋습니다.버전 관리 프레임워크에서 벗어나세요.위에서 제안한 솔루션을 사용하십시오.

추신. 더 나은 해결책이 있을 수 있습니다. 수행해야 할 작업(및 제공된 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 파일에서 수행할 수도 있습니다. 이는 특정 사용자에게만 해당되는 솔루션일 수 있습니다.

모든 사용자가 사용할 수 있는 또 다른 옵션은 경로의 다른 디렉터리(예: /usr/local/bin)에 /usr/bin/python을 가리키는 python2 심볼릭 링크를 만드는 것입니다. 어쩌면 다음과 같은 것일 수도 있습니다.

sudo ln -s /usr/bin/python /usr/local/bin/python2

그런 다음 모든 사용자나 스크립트는 python 또는 python2 명령을 찾아야 합니다. 물론 이 옵션을 설치하려면 관리자(루트) 권한이 필요합니다.

답변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

  1. 심볼릭 링크가 가리키는 값 찾기

    $ readlink /usr/bin/etags
    /etc/alternatives/emacs.etags
    

    노트:위의 결과는 또 다른 링크일 수 있습니다. 이 문제를 해결하려면 아래 #2를 참조하세요.

  2. 심볼릭 링크가 가리키는 값의 절대 경로 찾기

    $ readlink -f /usr/bin/etags
    /usr/bin/ctags
    

관련 정보