Nếu bạn sẵn sàng sửa đổi câu hỏi của mình một chút, bạn có thể thoát khỏi điều này.
NẾU các điểm nhập duy nhất cho gói của bạn được kiểm soát; ví dụ. bạn chỉ kiểm tra mã của bạn bằng cách làm một cái gì đó giống như cách gọi testsuite package/.../module.py
mà sẽ
THEN bạn có thể chắc chắn rằng điều đầu tiên bạn làm là import firstthing
, và trong gói/firstthing.py bạn có:
import sys
import os.path
packageDir = os.path.split(__name__)[0]
sys.path[:] = sys.path+[packageDir] # or maybe you want it first...
Các chính hãy báo trước rằng bạn sẽ không thể chạy các tệp python mà không phải đi qua các điểm nhập của bạn. Tôi luôn luôn muốn làm điều này cho mọi dự án tôi viết bằng python (để làm cho việc nhập khẩu tương đối hoạt động tốt), nhưng cá nhân tôi thấy điều này thật bất tiện mà tôi chỉ bỏ cuộc.
Ngoài ra còn có giải pháp thay thế thứ hai. Nó không phải là rằng không hợp lý để chỉ định rằng gói của bạn yêu cầu một gói khác trong đường dẫn python. Gói này có thể là một gói tiện ích thực hiện một hack lớn. Ví dụ: nếu tên của gói là "x", bạn có thể làm import x
sẽ sử dụng mô-đun kiểm tra để thực hiện phản chiếu trên ngăn xếp phiên dịch, cho phép bạn tìm ra mô-đun bạn đã nhập từ đó. Sau đó, bạn có thể làm một loại "ngược os.walk" bằng cách đi lên thư mục cha cho đến khi bạn tìm thấy gốc của gói của bạn (bằng cách kiểm tra một số tập tin chỉ số đặc biệt, hoặc biểu hiện, hoặc một cái gì đó). Sau đó, mã sẽ lập trình thực hiện sửa đổi ở trên của đường dẫn python qua sys.path
. Nó giống như ở trên, nhưng bạn có quyền tự do làm những việc như chạy bất kỳ tệp python nào mà không phải đi qua một điểm nhập cảnh khủng khiếp.
Nếu bạn có quyền kiểm soát chặt chẽ môi trường vỏ, bạn cũng có thể tăng thêm $ PYTHONPATH để bao gồm thư mục gói của bạn, nhưng điều này cực kỳ mong manh theo nhiều cách và thay vì không phù hợp.
Viết tắt bản hack rất nội suy như 'nhập x' thay đổi' sys.đường dẫn' hoặc ghi đè ngữ nghĩa 'builtin .__ import__' hoặc tạo móc nhập như được đề xuất trong http://docs.python.org/library/functions.html#__import__, bạn đang tìm kiếm một tính năng rất hợp lý không tồn tại trong hầu hết các ngôn ngữ tôi biết đến năm 2012. Theo ý kiến khiêm tốn của tôi, python là phù hợp hơn so với một số ngôn ngữ khác, nhưng vẫn đặc biệt không phù hợp với nhập khẩu không tiết. Quan điểm "pythonic" là sự rõ ràng như vậy là rõ ràng, và do đó tốt, có thể sẽ không làm cho tính năng sắp tới. – ninjagecko
Tôi biết tôi sẽ nhận được những gì là vấn đề lớn về điều này, bạn đang làm tái cấu trúc chính anyways. Viết mã là tái cấu trúc chính mọi lúc. Bạn làm việc với nhiều gói, bạn đặt một thứ gì đó ở một nơi, sau đó bạn nhận ra đó là chức năng chính có thể được sử dụng ở nơi khác, do đó bạn refactor nó trong một gói khác. Có rất nhiều điều bạn cần phải lo lắng khi bạn di chuyển mọi thứ xung quanh tôi đang cố gắng để giảm thiểu chi phí. Nhân tiện, tôi có m0 ở đầu mỗi gói, vì vậy khi mô-đun chuyển sang gói khác và vẫn đề cập đến m0 ở đầu gói đầu tiên, có thể dễ xảy ra lỗi. – gae123
Có, tôi đồng ý. Tuy nhiên, tôi không chắc chắn tại sao bạn đang nói những gì bạn đang nói. Tôi đã không hỏi "thỏa thuận lớn về việc này" là gì. – ninjagecko