2013-01-24 19 views
11

Tôi có một số mã trong một dự án mà tôi muốn sử dụng lại trong một dự án khác. Tôi cần làm gì (trong cả hai thư mục) để tôi có thể làm điều này?Làm cách nào để nhập các hàm từ các dự án khác bằng Python?

Cấu trúc thư mục là một cái gì đó như:

  • Foo
    • Project1
      • file1.py
      • file2.py
  • Bar
    • project2
      • fileX.py
      • fileY.py

Tôi muốn sử dụng chức năng từ file1.py và file2.py trong fileX.py và fileY.py .

Trả lời

18

Lý tưởng nhất là cả hai dự án sẽ là một gói python có thể cài đặt, nạp lại với __init__.py và setup.py. Sau đó, chúng có thể được cài đặt với python setup.py install hoặc tương tự.

Nếu không thể, không sử dụng execfile()! Thao tác các PYTHONPATH để thêm Foo để import Project1.file1 hoạt động.

Ví dụ, từ project2/fileX.py:

from os import path 
import sys 
sys.path.append(path.abspath('../Foo')) 

from Project1.file1 import something 

Tuy nhiên, thực Câu trả lời là để làm cho mỗi một gói cài đặt rời rạc.

+0

Project1 và Project2 đều đang ngồi trên máy chủ của tôi với cả hai phiên bản được kiểm soát. Nếu Project1 được cập nhật, thì tôi sẽ phải cập nhật gói đã cài đặt mỗi lần trên project2. Nhưng, nếu tôi thao tác sys.path của tôi, chỉ cần thực hiện một lệnh git pull trên Project1 sẽ cập nhật module của tôi. Tôi có làm gì không? Hoặc nó là okay để làm điều đó! Cảm ơn! – Abhishek

5

Bạn có thể muốn thực hiện một số module và sau đó nhập bất kỳ thứ gì bạn cần từ nó.

0

Tôi nghĩ bạn có thể thêm Foo vào đường dẫn Python hiện tại bằng cách sử dụng os.path.join() hoặc os.path.append() và làm from import Project1.file1 import function_name.

+1

Các thay đổi trong Project1 sẽ trong trường hợp như thế này có xu hướng phá vỡ dự đoán2 một cách giả mạo. Không phải là một ý tưởng tốt. Nó được xây dựng thành một mô-đun và có phiên bản được phát hành. –

+1

Điều này giống như giải pháp theo nghĩa đen cho vấn đề. Có thể có các cách khác (tốt hơn) để thực hiện nó, bao gồm cả cách bạn đã đề xuất. –

0

Bạn lấy mã bạn muốn sử dụng trong cả hai dự án và bạn đặt mã đó vào một module, mà bạn trích xuất vào một dự án riêng thứ ba. Dự án bạn tạo thành một gói mà bạn có thể làm việc riêng. Sau đó bạn phát hành phiên bản của nó và tái sử dụng chúng trong các dự án khác của bạn.

Điều quan trọng là bạn có các phiên bản mà bạn "phát hành" để bạn có thể theo dõi phiên bản của từng mô-đun mà từng dự án sử dụng. Nếu không, bạn sẽ kết thúc trong một tình huống mà một dự án cũ ngừng hoạt động vì bạn đã thực hiện các thay đổi không tương thích với mô-đun chung.

Nếu nó có thể sử dụng chung không chỉ cho bạn mà còn cho người khác, hãy cân nhắc tải nó lên PyPI.

5

Có rất nhiều thứ đang diễn ra tại đây. bạn nên đọc về các gói python và quản lý mô-đun http://docs.python.org/2/tutorial/modules.html#packages nhưng ý tưởng cơ bản là fileX cần biết vị trí file1 và file2 để sử dụng chúng.

Để biến một thư mục thành một gói, nó chỉ cần chứa tệp __init__.py. Những gì tôi sẽ đề nghị bạn làm là (trong một thiết bị đầu cuối)

$ touch Foo/__init__.py 
$ touch Foo/Project1/__init__.py 

(giả sử bạn đang sử dụng unix/linux).

Sau đó, bằng cách nào đó, tệpX cần biết vị trí của gói Foo. Bạn có thể gọi số sys.path.append(PATH) nơi PATH là vị trí của Foo.

cuối cùng bên trong tệpX.py bạn phải

import sys 
sys.path.append(PATH) #replace PATH with the path to Foo 

from Foo.Project1 import file1 

#use its functions 
file1.function_name(argument) 

nếu bạn thực sự muốn chỉ nói function_name mà không preceeding file1. bạn có thể nhập tất cả các chức năng của mình bằng cách nói from Foo.Project1.file1 import * tuy nhiên xin vui lòng lưu ý rằngfrom module import *cao tán thành vì nó pha trộn tên và làm cho mã ít dễ đọc và dễ hiểu hơn

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