Bạn có thể đã từng gặp phần mềm yêu cầu quyền sửa đổi biến PATH, hoặc hướng dẫn cài đặt của một chương trình khác nói một cách mơ hồ rằng bạn phải "thiết lập đúng biến LD_LIBRARY_PATH".
Là nhà khoa học dữ liệu, bạn có thể gặp các vấn đề về biến môi trường khác khi tương tác với ngăn xếp tính toán của mình (đặc biệt nếu bạn không có toàn quyền kiểm soát, như trường hợp của tôi). Bài viết này nhằm giải mã khái niệm biến môi trường là gì và cách nó được sử dụng trong bối cảnh khoa học dữ liệu.
Biến môi trường là gì?
Trước hết, hãy để tôi giải thích biến môi trường là gì, bằng cách đi sâu vào biến môi trường PATH. Tôi khuyến khích bạn chạy các lệnh ở đây trong terminal bash của mình (với chỉnh sửa phù hợp — đọc kỹ để hiểu tôi đang làm gì!).
Khi bạn đăng nhập vào hệ thống máy tính, chẳng hạn terminal máy tính cục bộ hoặc máy chủ từ xa qua SSH, trình thông dịch bash của bạn cần biết phải tìm các chương trình như nano (trình soạn thảo văn bản), git (phần mềm quản lý phiên bản) hay trình thực thi Python ở đâu. Điều này được kiểm soát bởi biến PATH. Nó chỉ định các đường dẫn đến những thư mục chứa các chương trình thực thi.
Theo thông lệ lịch sử, các chương trình dòng lệnh như nano, which và top nằm trong thư mục /usr/bin. (Theo thông lệ, thư mục /bin dành cho các tệp nhị phân phần mềm, vì vậy mới có tên /bin.) Đây là những chương trình đi kèm hệ điều hành và do đó cần quyền đặc biệt để nâng cấp.
Thử trong terminal của bạn:
$ which which
/usr/bin/which
$ which top
/usr/bin/top
Các chương trình khác (vì nhiều lý do) lại được cài trong /bin. ls là một ví dụ:
$ which ls
/bin/ls
Những chương trình khác nữa có thể nằm ở các thư mục đặc biệt khác:
$ which nano
/usr/local/bin/nano
Bash của bạn tìm các chương trình ở đâu? Nó dùng biến môi trường PATH. Trông nó như thế này:
$ echo $PATH
/usr/bin:/bin:/usr/local/bin
Điều quan trọng nhất cần nhớ về biến PATH là nó được "ngăn cách bằng dấu hai chấm". Tức là, mỗi đường dẫn thư mục được phân tách với đường dẫn kế tiếp bằng ký tự dấu hai chấm (:). Thứ tự bash tìm chương trình đi từ trái sang phải:
/usr/bin/bin/usr/local/bin
Trên máy của tôi, khi tôi gõ ls, bash sẽ tìm trong thư mục /usr/bin trước. Nó sẽ thấy ls không tồn tại ở /usr/bin nên chuyển sang thư mục tiếp theo, /bin. Vì ls nằm trong /bin, nó sẽ thực thi chương trình ls ở đó.
Như bạn thấy, điều này vừa cực kỳ linh hoạt để tùy chỉnh môi trường tính toán, nhưng cũng có thể cực kỳ khó chịu nếu một chương trình sửa biến PATH của bạn mà bạn không hay biết.
Khoan đã, bạn thực sự có thể sửa biến PATH? Đúng vậy, và có vài cách để làm điều đó.
Cách sửa biến PATH
Dùng một phiên Bash
Cách đầu tiên là tạm thời và chỉ áp dụng cho phiên bash hiện tại của bạn. Bạn có thể cho một thư mục có mức ưu tiên cao hơn các đường dẫn hiện có bằng cách "thêm vào đầu" biến PATH:
$ export PATH=/path/to/my/folder:$PATH
$ echo $PATH
/path/to/my/folder:/usr/bin:/bin:/usr/local/bin
Hoặc cho nó mức ưu tiên thấp hơn bằng cách "thêm vào cuối" biến PATH:
$ export PATH=$PATH:/path/to/my/folder
$ echo $PATH
/usr/bin:/bin:/usr/local/bin:/path/to/my/folder
Lý do đây là thay đổi tạm thời là vì tôi chỉ export nó trong phiên bash hiện tại.
bashrc hoặc tệp .bash_profile
Nếu muốn thay đổi có tính lâu dài hơn, tôi sẽ đưa chúng vào tệp .bashrc hoặc .bash_profile. (Tôi khuyến nghị dùng tệp .bashrc.) Tệp .bashrc/.bash_profile nằm trong thư mục home của bạn (biến môi trường $HOME chỉ định thư mục này), và là tệp mà trình thông dịch bash sẽ thực thi khi khởi chạy. Nó sẽ thực thi mọi lệnh bên trong đó. Điều này có nghĩa là bạn có thể thay đổi biến PATH chỉ bằng cách đặt trong .bashrc của mình:
...other stuff above...
# Make /path/to/folder have higher priority
export PATH=/path/to/folder:$PATH
# Make /path/to/other/folder have lower priority
export PATH=$PATH:/path/to/folder
...other stuff below...
Khoa học dữ liệu và biến môi trường PATH
Vậy, điều này liên quan gì đến nhà khoa học dữ liệu? Nếu bạn là nhà khoa học dữ liệu, khả năng cao bạn dùng Python, và trình thông dịch Python của bạn đến từ bản phân phối Anaconda (rất tuyệt, hãy dùng thử!). Trình cài đặt Anaconda sẽ ưu tiên thư mục /path/to/anaconda/bin trong biến môi trường PATH. Bạn có thể có các trình thông dịch Python khác cài trên hệ thống (ví dụ Apple có sẵn một bản). Tuy nhiên, việc sửa PATH này đảm bảo rằng mỗi khi bạn gõ python trong Bash, bạn sẽ chạy trình thông dịch Python đi kèm bản Anaconda. Trường hợp của tôi, sau khi cài Anaconda, PATH trông như sau:
$ echo $PATH
/Users/ericmjl/anaconda/bin:/usr/bin:/bin:/usr/local/bin
Còn hay hơn, môi trường conda sẽ thêm đường dẫn đến thư mục binary của môi trường conda lên trước trong khi môi trường được kích hoạt. Ví dụ, với blog của tôi, tôi giữ nó trong môi trường tên lektor. Vì vậy...
$ echo $PATH
/Users/ericmjl/anaconda/bin:/usr/bin:/bin:/usr/local/bin
$ which python
/Users/ericmjl/anaconda/bin/python
$ source activate lektor
$ echo $PATH
/Users/ericmjl/anaconda/envs/lektor/bin:/Users/ericmjl/anaconda/bin:/usr/bin:/bin:/usr/local/bin
$ which python
/Users/ericmjl/anaconda/envs/lektor/bin/python
Lưu ý terminal bash giờ sẽ ưu tiên chọn Python trong môi trường lektor có mức ưu tiên cao hơn.
Nếu bạn đã theo dõi đến đây, hy vọng bạn sẽ nhận ra có vài khái niệm quan trọng. Tóm tắt lại:
PATHlà một biến môi trường được lưu dưới dạng chuỗi văn bản thuần, được bash dùng để xác định nơi tìm các chương trình thực thi.PATHđược phân tách bằng dấu hai chấm; các thư mục ưu tiên cao hơn nằm bên trái chuỗi, còn ưu tiên thấp hơn nằm bên phải.PATHcó thể được sửa bằng cách thêm thư mục vào đầu hoặc cuối biến. Có thể làm tạm thời trong một phiên bash bằng lệnhexporttại dấu nhắc lệnh, hoặc làm vĩnh viễn qua các phiên bằng cách thêm dòngexportvào.bashrchoặc.bash_profile.
Những biến môi trường khác đáng chú ý
Còn những biến môi trường nào mà nhà khoa học dữ liệu có thể gặp? Đây là một số ví dụ bạn có thể thấy và có thể phải tự xử lý, đặc biệt khi quản trị viên hệ thống đang nghỉ phép (hoặc phản hồi quá chậm).
Cho nhu cầu chung, bạn chắc chắn sẽ muốn biết thư mục HOME của mình ở đâu — trên hệ thống Linux, thường là /home/username, còn trên macOS thường là /Users/username. Bạn có thể kiểm tra HOME bằng:
$ echo $HOME
/Users/ericmjl
Nếu bạn dùng Python, thì PYTHONPATH là một biến có thể hữu ích. Nó được trình thông dịch Python sử dụng và chỉ định nơi tìm các mô-đun/gói Python.
Nếu bạn phải làm việc với thư viện C++, thì biết biến môi trường LD_LIBRARY_PATH sẽ rất quan trọng. Tôi không am hiểu đủ để bàn sâu một cách thấu đáo, nên xin dẫn bạn tới trang web này để biết thêm về thực hành tốt khi dùng biến LD_LIBRARY_PATH.
Nếu bạn làm việc với Spark, thì biến môi trường PYSPARK_PYTHON sẽ đáng quan tâm. Về cơ bản, nó chỉ cho Spark biết dùng Python nào cho cả driver và worker; bạn cũng có thể đặt PYSPARK_DRIVER_PYTHON tách biệt với PYSPARK_PYTHON nếu cần.
Tùy biến biến môi trường của bạn
Đây là phần thú vị nhất! Cùng xem một số việc bạn có thể làm bằng cách "hack" các biến môi trường.
Hack #1: Bật quyền truy cập PyPy. Thỉnh thoảng tôi theo dõi tiến trình phát triển của PyPy, nhưng vì PyPy chưa phải là trình thông dịch Python mặc định và chưa thể conda install, tôi phải đặt nó trong thư mục riêng $HOME/pypy/bin. Để bật truy cập trình thông dịch PyPy, tôi cần chắc chắn rằng /path/to/pypy có trong biến PATH, nhưng với mức ưu tiên thấp hơn trình thông dịch CPython thông thường.
Hack #2: Bật truy cập các trình thông dịch/biên dịch ngôn ngữ khác. Điều này tương tự PyPy. Có lần tôi thử trình thông dịch JIT của Lua để dùng Torch cho học sâu và cần thêm đường dẫn đó vào .bashrc.
Hack #3: Cài gói Python vào thư mục home của bạn. Trên các hệ thống tính toán Linux dùng hệ thống modules thay vì môi trường conda, một modulefile mà bạn nạp có thể được cấu hình với môi trường ảo mà bạn không có quyền sửa đổi. Nếu cần cài một gói Python, bạn có thể dùng pip install --user my_pkg_name. Lệnh này sẽ cài vào $HOME/.local/lib/python-[version]/site-packages/. Trong trường hợp này, cần đảm bảo PYTHONPATH bao gồm $HOME/.local/lib/python-[version]/site-packages với mức ưu tiên đủ cao.
Hack 4: Gỡ lỗi khi mọi thứ trục trặc. Nếu có lỗi xảy ra, hoặc hành vi bất ngờ — tôi từng gặp trường hợp không tìm thấy đúng trình thông dịch Python sau khi nạp các module Linux — thì một cách gỡ lỗi là tạm thời đặt biến PATH về các "mặc định" hợp lý và source chúng, về cơ bản là "đặt lại" PATH, sau đó bạn có thể tự thêm vào đầu/cuối trong quá trình gỡ lỗi.
Để làm vậy, đặt dòng sau trong một tệp tên .path_default trong thư mục home của bạn:
export PATH="" # resets PATH to an empty string.
export PATH=/usr/bin:/bin:/usr/local/bin:$PATH # this is a sensible default; customize as needed.
Sau khi có sự cố, bạn có thể đặt lại biến PATH bằng lệnh "source":
$ echo $PATH
/some/complicated/path:/more/complicated/paths:/really/complicated/paths
$ source ~/.path_default
$ echo $PATH
/usr/bin:/bin:/usr/local/bin
Lưu ý - bạn cũng có thể chạy y hệt các lệnh này ngay trong phiên bash; tính tương tác có thể hữu ích.
Kết luận
Hy vọng bạn thấy bài viết hữu ích, và nó sẽ giúp bạn — xin được phép chơi chữ — tìm ra "đường dẫn" mỗi khi gặp các biến môi trường này!