2016-07-07 30 views
6

Tôi có tất cả các tệp .py bên trong một tập lệnh thư mục và tất cả các sổ ghi chép IPython của tôi trong một thư mục có tên Notebook.Đặt sys.path mặc định cho Máy tính xách tay IPython

Có nhiều phụ thuộc chéo cho mỗi tệp sổ ghi chép trên một hoặc nhiều tệp trên tập lệnh.

sys.path.append trên đầu mỗi máy tính xách tay có vẻ rườm rà và tôi hy vọng có cách thêm đường dẫn tra cứu mặc định giống như chúng tôi thêm PYTHONPATH vào .bash_profile.

Bây giờ tôi thực hiện như sau:

import sys 
sys.path.append("<path where DeriveFinalResultSet.py exists>) 
import DeriveFinalResultSet as drs 

Tôi muốn có một môi trường nơi mà tôi có thể làm như sau:

import DeriveFinalResultSet as drs 
+0

Tôi không biết câu trả lời ở đây, nhưng có lẽ bạn có thể thêm nó vào một tập tin tùy biến: https://ipython.org /ipython-doc/2/config/intro.html#setting-configurable-options – mgilson

+0

Hoặc, bạn có thể tạo một tập lệnh bash đơn giản với các tập PYTHONPATH trước khi gọi 'ipython' trên tập lệnh đã cho ... – mgilson

+0

@mgilson: Tôi đã cập nhật. bash_profile và chỉ PYTHONPATH trỏ đến thư mục tôi muốn. Và tôi bắn lên 'jupiter-notebook' từ bàn điều khiển và có vẻ như đang làm trò lừa. Tôi chỉ đăng câu trả lời dưới đây. Nếu bạn có thể, bạn có thể xác minh nếu nó là đúng? –

Trả lời

7

Để tránh "cấu hình ẩn" (tức là những thứ không nằm trong kiểm soát nguồn/máy cụ thể) và để duy trì một sự tách biệt máy tính xách tay/code như bạn mô tả, tôi làm điều gì đó giống như dưới đây:

code/ 
    mymodule.py 
    mypackage/ 
     __init__.py 

notebooks/ 
    mynb.ipynb 
    mynb2.ipynb 
    paths.py <--- below 

trong paths.py:

import sys 
import pathlib 
sys.path.insert(0, str(pathlib.Path(__file__).parents[1]/'code')) 
# sys.path[0] = str(pathlib.Path(__file__).parents[1]/'code') 

Sau đó, trong mynb*.ipynb tôi hạnh phúc có thể làm:

import paths 
import mymodule, mypackage 

vv

Dạng thứ hai có hiệu quả thay thế con đường nhập khẩu từ rỗng-string (thư mục hiện hành) vào thư mục "mã", mà có lẽ là một chút bụi. Điều này làm cho nhập khẩu không nhạy cảm với việc sử dụng các công cụ như os.chdir().

+0

Câu trả lời hay. Có thể 'pathlib.Path(). Resolve(). Parent' là một sự tinh chỉnh nhỏ? – aparkerlue

0

Sau khi một số nghiên cứu tôi nhận ra thay đổi PYTHONPATH trong .bash_profile nên làm các trick .

Dưới đây là hai dòng mà tôi thêm vào tôi .bash_profile

PYTHONPATH="<path where DeriveFinalResultSet.py exists>:$PYTHONPATH" 
export PYTHONPATH 

Để xác minh, tôi đã làm như sau sau khi mở một IPython Notebook tươi.

import sys 
print(sys.path) 
['', '**<path where DeriveFinalResultSet.py exists>**', '<some path>Google Drive/Project/AnimalPhotoBias/Notebooks', '<some path>anaconda/lib/python35.zip', '<some path>anaconda/lib/python3.5', '<some path>anaconda/lib/python3.5/plat-darwin', '<some path>anaconda/lib/python3.5/lib-dynload', '<some path>anaconda/lib/python3.5/site-packages/Sphinx-1.3.5-py3.5.egg', '<some path>anaconda/lib/python3.5/site-packages/setuptools-20.3-py3.5.egg', '<some path>anaconda/lib/python3.5/site-packages', '<some path>anaconda/lib/python3.5/site-packages/aeosa', '<some path>anaconda/lib/python3.5/site-packages/IPython/extensions', '<some path>.ipython'] 
+1

Điều này sẽ hoạt động. Bạn có thể đơn giản hóa nó thành 1 dòng: 'xuất PYTHONPATH =" ...: $ {PYTHONPATH} "' – mgilson

+0

@mgilson: Cảm ơn bạn đã bỏ phiếu! Ngày tốt! –

+2

Có lẽ, 'bash_profile' - không phải là nơi tốt nhất cho cấu hình như vậy. Nếu bạn có hai hoặc nhiều dự án, phương pháp này sẽ thêm quá nhiều đường dẫn bổ sung vào 'PYTHONPATH' và có thể dẫn đến xung đột tên. – maxkoryukov

2

tôi đã viết kịch bản bash đơn giản mà cập nhật đường dẫn và ra mắt Jupyter:

#!/usr/bin/env bash 

echo "Saving PYTHONPATH" 
ORIGINAL_PYTHONPATH=$PYTHONPATH 
echo "Prepending package to PYTHONPATH" 
export PYTHONPATH="$PWD/:$ORIGINAL_PYTHONPATH" 
echo "Starting Jupyter" 
jupyter notebook 
echo "Reverting to the original PYTHONPATH" 
export PYTHONPATH=$ORIGINAL_PYTHONPATH 
Các vấn đề liên quan