2012-04-15 24 views
44

Tôi có một foo mô đun, chứa util.py và bar.py.Nhập mô-đun python KHÔNG trên đường dẫn

Tôi muốn nhập nó trong phiên IDLE hoặc python. Làm thế nào để tôi đi về điều này?

Tôi không thể tìm thấy tài liệu về cách nhập mô-đun không có trong thư mục hiện tại hoặc PATH mặc định. Sau khi thử import "<full path>/foo/util.py", và from "<full path>" import util

Gần nhất tôi có thể nhận được là

import imp 
imp.load_source('foo.util','C:/.../dir/dir2/foo') 

nào đã cho tôi Permission denied trên cửa sổ 7.

+0

Cũng đáng xem [câu hỏi có liên quan này] (http://stackoverflow.com/questions/15109548/set-pythonpath-before-import-statements). Đặc biệt, tôi thích [câu trả lời hàng đầu] (http://stackoverflow.com/a/15109660/95852) ở đó, vì sự rõ ràng của nó về sự an toàn của những thay đổi đối với 'sys.path'. –

+0

Bản sao có thể có của [Làm thế nào để nhập một mô-đun cho đường dẫn đầy đủ?] (Http://stackoverflow.com/questions/67631/how-to-import-a-module-given-the-full-path) –

Trả lời

62

Một cách là chỉ cần sửa đổi của bạn path:

import sys 
sys.path.append('C:/full/path') 
from foo import util,bar 

Lưu ý rằng điều này đòi hỏi foo là một gói python, ví dụ: chứa một tập tin __init__.py. Nếu bạn không muốn sửa đổi sys.path, bạn có thể also modify the PYTHONPATH environment variable hoặc install the module on your system. Cẩn thận rằng điều này có nghĩa là các thư mục khác hoặc các tệp .py trong thư mục đó có thể được tải vô tình.

Do đó, bạn có thể muốn sử dụng imp.load_source để thay thế. Nó cần tên tệp, chứ không phải thư mục (đối với tệp mà người dùng hiện tại được phép đọc):

import imp 
util = imp.load_source('util', 'C:/full/path/foo/util.py') 
+0

Nó hoạt động, nhưng bây giờ khi cố gắng sử dụng util.method bằng cách sử dụng phương pháp, nó nói 'phương pháp' không được xác định. Nhưng tôi có thể sử dụng nó bởi util.method. Tại sao? – Vort3x

+2

Vì bạn chưa định nghĩa 'phương thức', chỉ" phương thức 'trong' util' ". Bạn có thể định nghĩa 'method = util.method' nếu muốn. – katrielalex

+0

Lưu ý rằng 'từ foo import *' là mã hóa không tốt trừ khi bạn chỉ hack xung quanh trong shell. – katrielalex

5

Bạn có thể tùy chỉnh các đường dẫn tìm kiếm mô-đun bằng cách sử dụng biến môi trường PYTHONPATH hoặc sửa đổi danh sách thư mục sys.path theo cách thủ công.

Xem tài liệu Module Search Path trên python.org.

2

này cung cấp cho một thử

import sys 
sys.path.append('c:/.../dir/dir2') 
import foo 
+1

-1 Bởi vì phụ thêm vào đường dẫn Python là một giải pháp tồi. Nó hoạt động, nhưng nó nghiêm trọng hơn imp.load_source vì người dùng có thể không muốn sửa đổi bất kỳ đường dẫn hệ thống nào, hoặc có thể đang làm việc trên máy tính mà họ không thể làm như vậy. Điều này thực sự là một trong những "tính năng" khó chịu nhất trong Python, mà ngược lại là một ngôn ngữ thanh lịch. Đó là ngớ ngẩn mà bạn không thể chỉ cần nhập khẩu một chuỗi đặt tên một đường dẫn đến tập tin .py khác.Và cho rằng bạn không thể, bảo vệ chống lại việc thay đổi đường dẫn hệ thống bằng cách sử dụng imp là hoàn toàn tốt hơn. – ely

+1

@EMS Ah .. Tôi thấy những gì bạn đang nói, tôi đã không nhận ra nó trước đây, nhưng bây giờ điểm bạn làm là rõ ràng. Cảm ơn bạn đã chỉ ra điều này. (Tôi có thể phải sửa đổi một số mã của riêng tôi ngay bây giờ :) – Levon

+3

Đừng lo lắng. Đây là mục đích của 'sys.path' (hoặc ít nhất * một * trường hợp sử dụng dự định). Ông F (dường như trước đây là EMS) là sai. Khi phihag ghi chú trong phản ứng của anh ta với chú thích -1 giống hệt nhau về câu trả lời của anh ta, 'sys.path' là * không * liên quan đến đường dẫn hệ thống tổng thể. –

1

Sau mẹo của tôi, tôi có giải pháp này. Chỉ cần cung cấp đường dẫn của tệp nguồn tới load_src và nó sẽ tải nó. Bạn cũng phải cung cấp tên, vì vậy bạn có thể nhập mô-đun này bằng tên này. Tôi thích làm theo cách này vì nó rõ ràng hơn:

def load_src(name, fpath): 
    import os, imp 
    return imp.load_source(name, os.path.join(os.path.dirname(__file__), fpath)) 

load_src("util", "../util.py") 
import util 

print util.method() 

khác (ít rõ ràng) cách là thế này:

util = load_src("util", "../util.py") # "import util" is implied here 

print util.method() # works, util was imported by the previous line 

Edit: phương pháp này được viết lại để làm cho nó rõ ràng hơn.

Các vấn đề liên quan