2015-03-16 13 views
5

tôi đã thiết lập này:imp.load_source một file hơn py, nhưng một py cũng tồn tại trong thư mục đó

File: a.ext1 a.py

a.ext1 tải một. py vì lý do nào đó, nhưng như một công cụ tôi cần để tải tập tin a.ext1.

Tôi có thể làm cho nó hoạt động tốt trong py3, nhưng tôi không thể làm cho nó hoạt động trong py2.

Đây là nỗ lực python2 của tôi: ** Đây là luồng chính, tất nhiên có nhiều mã xung quanh nó.

file = os.path.abspath(os.path.expanduser('a.ext1') 
directory = os.path.dirname(file) 
sys.path.append(directory) 
fullname = 'my.name.space.a' 
sys.modules['my.name.space'] = imp.new_module('my.name.space') 
x = imp.load_source(fullname,file) 

Bây giờ, nếu tôi làm; x, nó sẽ cho tôi biết:

module 'my.name.space' from '<path>/a.ext1' 

nhưng nếu tôi làm dir (x), nó mang lại cho tôi những thứ từ a.py. Tôi muốn nó cho tôi những thứ từ tập tin a.ext1.

Tôi có thể làm việc này trên py2 như thế nào?

Sau đây là cách nó hoạt động trên py3:

file = os.path.abspath(os.path.expanduser('a.ext1')) 
directory = os.path.dirname(file) 
sys.path.append(directory) 
fullname = 'my.name.space.a' 
loader = importlib.machinery.SourceFileLoader(fullname = fullname, 
               path = file) 
x = loader.load_module() 

Bây giờ x là chính xác những gì tôi muốn, tập tin a.ext1, và không phải là py

Bất kỳ ý tưởng làm thế nào tôi có thể làm việc này cho py2?

(Btw tôi đã đọc tất cả tôi có thể tìm về chủ đề này trên Stack tràn, nhưng nó chưa bao giờ là trường hợp một py cũng tồn tại)

Trả lời

0

Dunno về mumbo jumbo với việc tạo ra các module rỗng và phụ thêm đường dẫn , nhưng các tác phẩm rất giống với tôi trên 2.7. Chắc chắn không có vấn đề gì với một ví dụ độc lập đơn giản.

Tôi muốn nói của bạn a.py đang được nạp vào my.name.space.a là tốt, ở nơi khác trong chương trình, trong trường hợp này đó là nội dung đụng độ với bất cứ điều gì khác mà bạn tải dưới cái tên mô-đun tương tự. Chỉ có thể có một trường hợp mô-đun trên toàn cầu duy nhất của một tên được đặt tại một thời điểm, ví dụ:

a.py:

py_stuff = 1 

a.ext1

ext1_stuff = 1 

test-ok.py:

import imp 

x = imp.load_source('a', 'a.ext1') 

print(x) # <module 'a' from 'a.ext1'> 
print(dir(x)) # ['__builtins__', ..., 'ext1_stuff'] 

test-not-ok.py:

import imp 

import a 

x = imp.load_source('a', 'a.ext1') 

print(x) # <module 'a' from 'a.ext1'> 
print(dir(x)) # ['__builtins__', ..., 'ext1_stuff', 'py_stuff'] 
Các vấn đề liên quan