2011-12-29 25 views
48

Tôi có một thư mục đầy đủ các tập lệnh (giả sử project/bin). Tôi cũng có thư viện ở số project/lib và muốn tập lệnh tự động tải thư viện. Đây là những gì tôi thường sử dụng ở đầu mỗi tập lệnh:Python: Cách tốt nhất để thêm vào sys.path liên quan đến tập lệnh chạy hiện tại

#!/usr/bin/python 
from os.path import dirname, realpath, sep, pardir 
import sys 
sys.path.append(dirname(realpath(__file__)) + sep + pardir + sep + "lib") 

# ... now the real code 
import mylib 

Đây là loại cồng kềnh, xấu xí và phải được dán vào đầu mỗi tệp. Có cách nào tốt hơn để làm điều này?

Really những gì tôi đang hy vọng là một cái gì đó như suôn sẻ như thế này:

#!/usr/bin/python 
import sys.path 
from os.path import pardir, sep 
sys.path.append_relative(pardir + sep + "lib") 

import mylib 

Hoặc thậm chí tốt hơn, cái gì đó sẽ không phá vỡ khi biên tập viên của tôi (hoặc ai đó có cam kết truy cập) quyết định sắp xếp lại nhập khẩu như là một phần của quá trình làm sạch của nó:

#!/usr/bin/python --relpath_append ../lib 
import mylib 

Điều đó sẽ không chuyển trực tiếp đến nền tảng không posix, nhưng nó sẽ giữ mọi thứ sạch sẽ.

+0

Xem thêm: http://stackoverflow.com/questions/2349991/python-how-to-import-other-python-files/20749411#20749411 – dreftymac

Trả lời

13

Nếu bạn không muốn chỉnh sửa từng file

  • Install bạn thư viện giống như một libray trăn bình thường
    hoặc
  • Đặt PYTHONPATH để của bạn lib

hoặc nếu bạn sẵn sàng thêm một dòng vào mỗi tệp, hãy thêm tuyên bố nhập ở trên cùng, ví dụ:

giữ import_my_lib.py trong bin và import_my_lib một cách chính xác có thể thiết lập đường dẫn python để bất cứ điều gì lib bạn muốn

72

Đây là những gì tôi sử dụng:

import os, sys 
sys.path.append(os.path.join(os.path.dirname(__file__), "lib")) 
9

Tạo một module wrapper project/bin/lib, chứa này:

import sys, os 

sys.path.insert(0, os.path.join(
    os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')) 

import mylib 

del sys.path[0], sys, os 

Sau đó, bạn có thể thay thế tất cả cruft ở trên cùng của kịch bản của bạn với:

#!/usr/bin/python 
from lib import mylib 
4

Nếu bạn không muốn thay đổi nội dung kịch bản trong bất kỳ cách, hãy thêm thư mục làm việc hiện tại . đến $ PYTHONPATH (xem ví dụ dưới đây)

PYTHONPATH=.:$PYTHONPATH alembic revision --autogenerate -m "First revision" 

Và gọi nó là một ngày!

+0

https: //docs.python.org/3/tutorial/modules.html#the-module-search-path nói: "sys.path được khởi tạo từ các vị trí sau: -Các thư mục chứa tập lệnh nhập". Tôi nghĩ điều này không đúng. – jms

9

Tôi đang sử dụng:

import sys,os 
sys.path.append(os.getcwd()) 
Các vấn đề liên quan