2012-03-06 36 views
15

Ok vì vậy tôi thực sự muốn có được quyền này bởi vì tôi tiếp tục chạy vào nó khi tạo ra một số gói py2app/py2exe lớn. Vì vậy, tôi có gói chứa nhiều mô-đun/gói có thể nằm trong gói site/vị trí mặc định của người dùng (nếu người dùng có phân phối python) nhưng tôi muốn các gói phân phối của mình có hiệu lực trước khi chạy từ bản phân phối của tôi .đường dẫn trăn và thứ tự nhập

Bây giờ từ những gì tôi đã đọc herePYTHONPATH nên điều 1st thêm vào sys.path sau khi thư mục hiện hành, tuy nhiên từ những gì tôi đã thử nghiệm trên máy tính của tôi đó không phải là trường hợp và tất cả các thư mục được xác định trong $site-packages$/easy-install.pth được ưu tiên hơn điều này. Vì vậy, ai đó có thể vui lòng cho tôi một số giải thích sâu hơn về thứ tự nhập này // giúp tôi tìm cách thiết lập các biến môi trường theo cách mà các gói tôi phân phối được ưu tiên hơn các gói mặc định. Cho đến nay nỗ lực của tôi là, ví dụ trên máy Mac-OS py2app, trong tập lệnh nhập cảnh của tôi:

os.environ['PYTHONPATH'] = DATA_PATH + ':' 
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(DATA_PATH 
                  , 'lib') + ':' 
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(
           DATA_PATH, 'lib', 'python2.7', 'site-packages') + ':' 
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(
          DATA_PATH, 'lib', 'python2.7', 'site-packages.zip') 

Đây là cấu trúc cơ bản của gói được tạo bởi py2app. Sau đó, tôi chỉ:

SERVER = subprocess.Popen([PYTHON_EXE_PATH, '-m', 'bin.rpserver' 
          , cfg.RPC_SERVER_IP, cfg.RPC_SERVER_PORT], 
          shell=False, stdin=IN_FILE, stdout=OUT_FILE, 
          stderr=ERR_FILE) 

Ở đây PYTHON_EXE_PATH là đường dẫn đến exe python được thêm bởi py2app vào gói. Bây giờ điều này hoạt động tốt trên một máy mà không có một python cài đặt. Tuy nhiên khi phân phối python đã có, các gói trang web của họ được ưu tiên.

Trả lời

13

Python tìm kiếm các đường dẫn trong sys.path theo thứ tự (xem http://docs.python.org/tutorial/modules.html#the-module-search-path). easy_install thay đổi danh sách này trực tiếp (xem dòng cuối cùng trong tập tin dễ install.pth của bạn):

import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new) 

cơ bản này có bất cứ điều gì các thư mục được thêm vào và chèn chúng vào đầu danh sách.

Cũng xem Eggs in path before PYTHONPATH environment variable.

+0

Có lẽ tùy chọn đơn giản nhất khi phân phối dự án py2exe là phân phối tất cả các mô-đun cần thiết và pythonXX.dll cùng với nó, sao cho nó là gói tự chứa sẽ không bị ảnh hưởng bởi bất kỳ phiên bản python nào đang được cài đặt. Một dự án thú vị khác cho bạn có thể là virtualenv (http://pypi.python.org/pypi/virtualenv) – cwa

+0

Vì vậy, phân phối pythonXX.dll nên dừng quá trình tôi vừa mô tả bằng cách xảy ra? Ở mức độ nào trong thư mục phân phối nên dll được? Tôi hỏi vì hiện tại tôi đang thêm pythonXX.dll vào gói nhưng sự cố vẫn xảy ra. – Bogdan

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