2012-06-01 20 views
6

Tôi có một setup.py mà cần phải hỗ trợ cả hai Python 2 và 3.Các thử nghiệm không được hội tụ bởi 2to3 trong setup.py?

Mã này hiện đang hoạt động và là cài đặt bằng Python 2.x

Nếu tôi thêm mệnh đề use_2to3 = True để setup.py của tôi, sau đó các mô-đun có thể cài đặt bằng Python 3, tuy nhiên, làm một:

python setup.py test 

Nguyên nhân thất bại là một trong những bài kiểm tra sử dụng lớp StringIO, và dòng nhập khẩu goofs bằng Python 3 (đó là hiện from StringIO import StringIO, nơi trong Python3 nó phải là from io import StringIO

Tôi nghĩ rằng mặc dù bạn thêm từ khóa use_2to3 tất cả các kiểm tra (bao gồm cả unittests) đã được xử lý bởi 2to3 trước khi được kiểm tra.

Tôi đang thiếu gì? Trong trường hợp nó giúp, phần lớn các setup.py của tôi trông giống như:

from setuptools import setup 

setup(
    name='myproject', 
    version='1.0', 
    description='My Cool project', 
    classifiers = [ 
     'Programming Language :: Python', 
     'Programming Language :: Python :: 3', 
    ], 

    py_modules=['mymodule'], 
    test_suite='test_mymodule', 
    zip_safe=False, 
    use_2to3 = True, 
) 

Chỉnh sửa: lý do tôi cảm thấy như thể 2to3 là ​​không nhận được chạy trên một python setup.py test là nó thổi lên & dưới cùng của stacktrace đọc:

File "/home/aparkin/temp/mymodule/test_mymodule.py", line 18, in <module> 
    from StringIO import StringIO 

Nhưng nếu tôi chạy 2to3 trên test_mymodule.py, sau đó dòng nhập khẩu nên đã được làm lại để:

from io import StringIO 

Và (lúc tồi tệ nhất) các bài kiểm tra nên chỉ ind thất bại.

Trả lời

1

Để phân phối chọn mô-đun của bạn và chạy trong 2to3, nó phải được liệt kê trong py_modules. Vì vậy, hãy thay đổi điều đó thành:

py_modules=['mymodule', 'test_mymodule'], 

Thật không may điều này có tác dụng phụ khi cài đặt test_mymodule khi bạn cài đặt dự án mà bạn có thể không muốn. Đối với các trường hợp như thế này, tôi thường sẽ chuyển đổi dự án thành một gói với gói con mymodule.tests. Bằng cách này các bài kiểm tra có thể được "cài đặt" mà không cần thêm lộn xộn bổ sung.

+1

Bạn có ý nghĩa gì với gói phụ của mymodule.tests? –

+0

Tôi có nghĩa là tạo một gói có tên là "mymodule" và dưới nó tạo ra một thư mục có tên là "tests" và đặt tất cả các module test của bạn vào đó, nhớ bao gồm '__init __. Py'as để kiểm tra là một gói con của mymodule (do đó mymodule.tests) – Iguananaut

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