Używam MacOSX- bash
a jako mojej powłoki. Mam dowiązanie symboliczne, utworzone w ten sposób:
ln -s /usr/bin/python python2
Mam pakiet, który używa Python2 i chcę utworzyć łącze do symbolu w moim bieżącym katalogu roboczym, do /usr/bin/python
którego faktycznie należy Python2. Kiedy robię python2
z linii poleceń, pojawia się ten błąd:
python2: realpath couldn't resolve "/usr/bin/python2"
Ale wywołanie go w ten ./python2
sposób poprawnie rozwiązuje ścieżkę. Mój PATH
ma .
w tym. W rzeczywistości zmodyfikowałem go do testowania, aby mieć tylko .
w sobie.
Jak to rozwiązać? Dzięki!
Kontekst
Szereg sugerowanych poniżej rozwiązań nie będzie dla mnie działać. Starałem się wyjaśnić moje pytanie tak skoncentrowane i krótkie, jak to możliwe, aby ludzie nie utonęli w morzu tekstu, ale najwyraźniej muszę podać więcej informacji.
Próbuję rozwinąć pakiet, który sklonowałem z git. Oryginalny pakiet, git-multimail
jest / został opracowany na pewnym wariancie systemu Linux (domyślam się Ubuntu). Próbowałem go zmodyfikować, aby móc go używać i jego pakietu testowego na MacOSX przy możliwie jak najmniejszej modyfikacji. Oto dlaczego niektóre z proponowanych rozwiązań nie są idealne:
Jako root utwórz
python2
dowiązanie symboliczne w / usr / bin /. Szukam rozwiązania, które nie wymagałoby tego. Na początku była to oczywista opcja, ale chciałbym rozwiązania, które jak najmniej modyfikuje system hosta. Dlatego chciałem utworzyć tymczasowe dowiązanie symboliczne w bieżącym katalogu roboczym, dodać CWD (tj..
) Do mojej ścieżki, a następnie zniszczyć to po zakończeniu (tj. Dowiązanie symboliczne).Utwórz skrypt opakowania, aby wywoływał skrypt Pythona z istniejącym pythonem. Problem polega na tym, że znaczna część pakietu testowego używa rzeczywistych plików skryptowych jako plików wykonywalnych, w zależności od shebang w celu znalezienia właściwego środowiska wykonywania. Oznaczałoby to znaczną edycję pakietu testowego. W tym kontekście (patrz poniżej fragment struktury testowej) musiałbym dodać opakowanie dla każdego
.py
pliku; ponadto użytkownik / programista musiałby być świadomy różnych zasad korzystania z pakietu w zależności od systemu, w którym jest zainstalowany (tj. w MacOSX upewnij się, że nie używasz plików python bez wywoływania ich przez opakowanie lub jawne wywołanie/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" }
Zmiana wszystkich
python2
odniesień dopython
. README to sugeruje, ale skutecznie czyni kontrolę wersji bezużyteczną, ponieważ system widzi zmianę jako nową wersję, podczas gdy w rzeczywistości nie jest (semantycznie).
Korzystałem (3), ale próbuję znaleźć lepsze rozwiązanie. Jestem skłonny zaakceptować, że tak właśnie jest (tzn. Nie ma odpowiedniego sposobu, aby wskazać „python2”, aby /usr/bin/python
był przenośny i dyskretny bez wielu zmian w pakiecie testowym i aktualnej strukturze).
ln -s /usr/bin/python /usr/bin/python2
git-multimail.py
to#!/usr/bin/env python2
, więc jest (stosunkowo) prosty sposób to zrobić.ln -s /usr/bin/python2.7 /usr/local/bin/python2
nieOdpowiedzi:
Jeśli chcesz rozwiązać (lub zbadać) dowiązanie symboliczne, możesz użyć niezależnej od platformy biblioteki bash 'realpath-lib'. Domyślnie emuluje readlink i działa na Macu lub Unixie. Można go znaleźć na Github lub Bitbucket i jest bezpłatny.
Ale wygląda na to, że chcesz po prostu zrobić python2 (zamiast ./python2) z lokalnego (roboczego) katalogu. Można to zrobić za pomocą aliasu w pliku .bashrc, w przeciwnym razie konieczne będzie dodanie katalogu roboczego (zawierającego dowiązanie symboliczne) do zmiennej środowiskowej PATH. Można to również zrobić tylko dla bieżącej sesji lub w pliku .bashrc dla przyszłych sesji. To może być rozwiązanie dla konkretnego użytkownika.
Inną opcją, która działałaby dla wszystkich użytkowników, byłoby utworzenie dowiązania symbolicznego python2 do / usr / bin / python w innym katalogu na ścieżce, powiedzmy w / usr / local / bin. Być może coś takiego:
Następnie każdy użytkownik lub skrypt powinien znaleźć komendy python lub python2. Oczywiście ta opcja wymaga uprawnień administratora (root) do zainstalowania.
źródło
python2
do/usr/bin
(choć mogę wyświetlić dodanie go jako poprawa, szczerze mówiąc).Wydaje mi się, że używasz systemu Apple do zarządzania wieloma wersjami tego samego programu i przełączania się między nimi. Możesz osiągnąć to, co chcesz, mniej elegancko, ale bez problemów, za pomocą następującego skryptu o nazwie
python2
:Ustaw go jako wykonywalny (
chmod +x python2
), a będziesz w biznesie.Wyjaśnienie problemu:
Po uruchomieniu
/usr/bin/python
znajduje się i wykonujepython2.7
w tym samym katalogu. Twoje łącze symboliczne kończy się niepowodzeniem, ponieważ system podąża za dowiązaniem symbolicznym do/usr/bin
, a następnie szuka i nie możepython2
tam znaleźć . Możesz przejść o krok dalej, używając „twardego linku” zamiast linku symbolicznego:Teraz nie ma dowiązania symbolicznego, tylko dwie nazwy plików dla tego samego pliku (i-węzła). Ale teraz nie mogę wyświetlić następującego komunikatu:
Zauważ
python22.7
: Framework dodaje2.7
do utworzonej nazwy! Zamiast próbować to rozwikłać i skonfigurować las linków, który odpowiada jego oczekiwaniom, radzę trzymać się z daleka od ram zarządzania wersjami i skorzystać z sugerowanego powyżej rozwiązania.PS. Może być lepsze rozwiązanie: jeśli wytłumaczysz, co musisz zrobić na początku (dlaczego musisz podać
python2
jako aliaspython
), ktoś prawdopodobnie może ci pomóc w inny sposób. Jest to znane jako „problem XY” w żargonie wymiany stosów ...źródło
/usr/bin/python
znajduje i wykonuje Python2.7 w tym samym katalogu. To bardzo mylące stwierdzenie. Jeśli opisujesz przypadek, w którym/usr/bin/python
znajduje się dowiązanie symboliczne, podaj bardziej szczegółowe informacje.Próbować:
źródło
Możesz użyć polecenia Unix,
readlink
aby znaleźć fizyczną ścieżkę do linków.Przykłady
Powiedz, że mam następujący link:
Aby znaleźć wartość, na którą wskazuje dowiązanie symboliczne
UWAGA: Powyższy wynik może być kolejnym linkiem. Aby rozwiązać ten problem, patrz punkt 2 poniżej.
Aby znaleźć bezwzględną ścieżkę wartości, na którą wskazuje dowiązanie symboliczne
źródło
Nie rozumiem - jak myślisz, czy link do opakowania jest w porządku, ale nie skrypt do pakowania ? Każdy z nich jest jedynie poziomem pośrednictwa. I czy nadal nie musisz instruować użytkowników, aby dzwonili tylko z określonego katalogu?
W każdym razie możesz uzyskać bieżący katalog roboczy w
$PATH
:Proszę weź . z twojego
$PATH
. To okropny pomysł.źródło
.
w mojej $ PATH jest to zły pomysł? Jeśli umieszczę go na końcu, ostatnim miejscem, które będzie sprawdzane, będzie mój bieżący katalog roboczy (tj. `PATH =" $ {PATH}: $ {PWD} ". Skrypt otoki oznacza, że dla każdego pliku Pythona muszę utworzyć dodatkowy plik. Link otoki do pliku wykonywalnego Pythona po prostu tworzy dla mnie jedną rzecz--bind mount
być wykonywalny w bieżącym katalogu lub (jak sądzę tylko w systemie Linux) nawetchroot
w razie potrzeby. Ale . w$PATH
pracach dla dowolnego katalogu i nie jest specyficzny. Jest to niebezpieczne dla twoich użytkowników. W każdym razie bardzo wyraźnie pokazałem, jak to zrobić powyżej. Nie spełnia twoich wymagań?Re @alexis odpowiedź, wersja Pythona
/usr/bin
nie jest prawdziwym pythonem.Powinno to być widoczne na trzy sposoby:
Błąd, który otrzymujemy, nie jest tym, który zwykle powoduje Python. Zachowanie Pythona nie polega na szukaniu innego Pythona, ale na uruchamianiu skryptów Pythona.
Jeśli obliczysz shasum
/usr/bin/python
i faktycznie uruchamiany python2.7 :Oni są zupełnie inni. Ponadto rozmiary plików różnią się o ~ 20 000 bajtów:
vs.
Więc (jak wskazuje błąd)
/usr/bin/python
odwraca się i szuka/usr/bin/python2.7
:Właśnie dlatego następujące prace (dzięki uprzejmości @ liangmin-li):
źródło
ls
wyjścia, że/usr/bin/python
„nie jest to prawdziwy python”.python
binarnego tłumacza, ale pamiętaj, że odpowiedzi tutaj powinny być przydatne dla bardziej ogólnej publiczności U&L ...