Tôi đang sử dụng MacOSX bash
. Tôi có liên kết tượng trưng, được tạo như thế này:
ln -s /usr/bin/python python2
Tôi có một gói sử dụng python2 và tôi muốn tạo một liên kết biểu tượng trong thư mục làm việc hiện tại của tôi /usr/bin/python
thực sự là python2. Khi tôi thực hiện python2
từ dòng lệnh, tôi gặp lỗi này:
python2: realpath couldn't resolve "/usr/bin/python2"
Nhưng gọi nó như thế này ./python2
giải quyết đường dẫn chính xác. Của tôi PATH
có .
trong đó. Trong thực tế, tôi đã sửa đổi nó, để thử nghiệm, chỉ có .
trong đó.
Làm thế nào để tôi giải quyết điều này? Cảm ơn!
Bối cảnh
Một số giải pháp được đề xuất dưới đây sẽ không hiệu quả với tôi. Tôi đã cố gắng chắt lọc câu hỏi của mình một cách tập trung và ngắn gọn nhất có thể để mọi người không bị chìm trong một biển văn bản, nhưng rõ ràng tôi cần cung cấp thêm thông tin cơ bản.
Tôi đang cố gắng phát triển trên một gói mà tôi đã nhân bản từ git. Gói ban đầu git-multimail
, được / được phát triển trên một số biến thể của Linux (tôi đoán là Ubuntu). Tôi đã cố gắng sửa đổi nó để có thể sử dụng nó và bộ thử nghiệm của nó trên MacOSX với ít sửa đổi nhất có thể. Đây là lý do tại sao một số giải pháp được đề xuất không lý tưởng:
Là root, tạo
python2
symlink trong / usr / bin /. Tôi đang tìm kiếm một giải pháp sẽ không yêu cầu điều này. Đây là một lựa chọn rõ ràng lúc đầu, nhưng tôi muốn một giải pháp sửa đổi hệ thống máy chủ ít nhất có thể. Đây là lý do tại sao tôi muốn tạo một liên kết tượng trưng tạm thời trong thư mục làm việc hiện tại, thêm CWD (tức là.
) vào đường dẫn của tôi và sau đó hủy điều này khi kết thúc (tức là liên kết tượng trưng).Tạo một tập lệnh bao bọc để gọi tập lệnh python với python hiện có. Vấn đề với điều này là phần lớn bộ kiểm thử sử dụng script_files thực tế làm tệp thực thi, tùy thuộc vào shebang để tìm môi trường thực thi chính xác. Điều này có nghĩa là chỉnh sửa bộ kiểm tra đáng kể. Trong ngữ cảnh này, (xem bên dưới để biết một đoạn của khung kiểm tra), tôi sẽ phải thêm một trình bao bọc cho mỗi
.py
tệp; hơn nữa người dùng / nhà phát triển sẽ phải nhận thức được các quy tắc khác nhau khi sử dụng gói tùy thuộc vào hệ thống họ đang sử dụng (tức là trên MacOSX đảm bảo bạn không sử dụng các tệp python mà không gọi chúng qua trình bao bọc hoặc gọi rõ ràng/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" }
Thay đổi tất cả các
python2
tham chiếu đếnpython
. README gợi ý điều này, nhưng điều này thực sự khiến việc kiểm soát phiên bản trở nên vô dụng vì hệ thống coi sự thay đổi là phiên bản mới, trong khi thực tế nó không phải là (về mặt ngữ nghĩa).
Tôi đã sử dụng (3) nhưng tôi đang cố gắng tìm một giải pháp tốt hơn. Tôi sẵn sàng chấp nhận rằng đây chỉ là cách mọi thứ diễn ra (nghĩa là không có cách nào phù hợp để chỉ ra 'python2' /usr/bin/python
là di động và không phô trương mà không có nhiều thay đổi đối với bộ thử nghiệm và khung thực tế).
git-multimail.py
nó là #!/usr/bin/env python2
, vì vậy có một cách (tương đối) đơn giản để làm điều này.
ln -s /usr/bin/python2.7 /usr/local/bin/python2
đã làm
ln -s /usr/bin/python /usr/bin/python2