2009-08-02 17 views
11

Tôi đang làm một ứng dụng PyQt độc lập trên nền tảng. Tôi dự định sử dụng viết một tập tin setup.py bằng cách sử dụng setuptools. Cho đến nay tôi đã xoay sở để phát triển nền tảng, ví dụ: tải các tùy chọn cụ thể để thiết lập() tùy thuộc vào nền tảng để sử dụng py2exe trên Windows ... vv ...Truy cập các tập tin dữ liệu trước và sau khi distutils/setuptools

Tuy nhiên, với ứng dụng của tôi, tôi đang phân phối một số chủ đề, HTML và hình ảnh, tôi cần tải những hình ảnh này trong ứng dụng lúc chạy. Cho đến nay chúng được lưu trữ trong các chủ đề/thư mục của ứng dụng.

Tôi đã đọc tài liệu về setuptools và distutils và tìm ra rằng nếu tôi đã thiết lập() tùy chọn data_files với tất cả các tệp trong thư mục/chủ đề sẽ được cài đặt trong "share/MyApp/themes /" it sẽ được cài đặt với/usr/prefix hoặc bất kỳ sys.prefix nào trên nền tảng. Tôi giả sử rằng tôi sẽ tìm thấy các tệp dữ liệu bằng cách sử dụng os.path.join (sys.prefix, "chia sẻ", "MyApp", "chủ đề") đề cập đến nền tảng nào tôi đang sử dụng, đúng không?

Tuy nhiên, tôi cũng muốn có thể truy cập vào các tệp dữ liệu trong quá trình phát triển, nơi chúng nằm trong chủ đề/thư mục liên quan đến nguồn ứng dụng. Làm thế nào để tôi làm điều này? Có cách nào thông minh để tìm hiểu xem ứng dụng đã được cài đặt chưa? Hoặc một tiện ích để ánh xạ tới các tệp dữ liệu bất kể chúng đang ở đâu, tại thời điểm này?

Tôi thực sự ghét phải thêm tất cả các loại hacks xấu xí để xem có chủ đề nào liên quan đến nguồn hay trong sys.prefix/share ... v.v ... Làm cách nào để tìm tệp dữ liệu trong quá trình phát triển? và sau khi cài đặt trên nền tảng tùy ý?

Trả lời

5

Tôi đã sử dụng một phương pháp hữu ích được gọi là data_file:

def data_file(fname): 
    """Return the path to a data file of ours.""" 
    return os.path.join(os.path.split(__file__)[0], fname) 

tôi đặt này trong init tập tin py trong dự án của tôi, và sau đó gọi nó từ bất cứ nơi nào trong gói của tôi để có được một tập tin tương đối cho gói.

Trình thiết lập cung cấp chức năng tương tự, nhưng điều này không cần các công cụ thiết lập.

+0

Cách này sẽ hoạt động khi data_files được cài đặt trong/usr/share/AppName/themes/ Và tệp thực thi của tôi có tên/usr/lib/AppName tôi giả định ... Tài liệu DistUtils cho biết sẽ được cài đặt với sys.prefix làm tiền tố cho đường dẫn tương đối mà tôi đã cung cấp cho các tệp dữ liệu được lưu trữ trong ... Trên các tệp dữ liệu hệ thống * nix cũng có thể nằm trong/usr/share/AppName/ – jonasfj

+1

Tôi đã sử dụng nó với một tùy chọn package_data trong setup.py. Không chắc chắn về data_files. –

+0

OK ... Yeah, package_data cũng là một tùy chọn ... Có lẽ tôi nên đi với điều đó ... Tôi chỉ không nghĩ rằng nó sẽ tạo ra các gói tuân thủ Debian :) – jonasfj

7

Bạn có thể thử pkg_resources:

my_data = pkg_resources.resource_string(__name__, fname) 
+0

các tệp dữ liệu của tôi được cài đặt trong xx.egg root, trong khi chuỗi tài nguyên cố gắng lấy chúng từ __name__ (phù thủy nằm trong 'xxx.egg/package/subpackage') để nó luôn thất bại. –

+0

@JensTimmerman: nhấp vào liên kết: * "đối số resource_name được diễn giải tương đối so với gói có tên" *. Vì vậy, nếu các tập tin của bạn được cài đặt vào thư mục gói của xxx; sử dụng xxx thay vì '__name__' hoặc định cấu hình để cài đặt các tệp vào thư mục của subpackage. – jfs

+0

tốt, chúng được cài đặt trong thư mục gốc của trứng, vì vậy thư mục gói mặc định, nhưng sử dụng một chuỗi rỗng không hoạt động. Nó dường như không làm mọi thứ dễ dàng hơn nếu tôi phải cấu hình nó để được cài đặt ngay bên cạnh nguồn ... –

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