2013-03-12 28 views
19

Tôi gặp sự cố khi sử dụng setup.py để thiết lập gói python. Trước tiên, tôi có thiết lập thư mục sau:Lỗi nhập trên gói đã cài đặt bằng cách sử dụng setup.py

maindir 
    |- setup.py 
    |-mymodule 
     |- __init__.py 
     |- mainmodule.py 
     |-subdir 
      |- __init__.py 
      |- submodule.py 

ví dụ: thư mục dự án chứa setup.py và một thư mục mymodule, mà tự nó chứa hai mô-đun python trong hai thư mục. File submodule.py chứa chỉ

teststring = "hello world" 

mainmodule.py chứa:

from .subdir import submodule 
mainstring = "42" 

setup.py chứa:

import os 
from setuptools import setup 
setup(
    name = "mytestmodule", 
    version = "0.0.1", 
    description = ("A simple module."), 
    packages=['mymodule'], 
) 

Khi tôi làm from mymodule import mainmodule với ipython từ bên trong sourceTest hành vi hoạt động như mong đợi và tôi có thể tham khảo ví dụ mainmodule.submodule.teststring cung cấp cho tôi chuỗi hello world.

Ở phía bên kia, khi tôi cài đặt này 'gói' sử dụng python setup.py install và cố gắng làm như vậy (từ bên trong một số thư mục khác), tôi nhận được một lỗi nhập khẩu:

In [1]: from mymodule import mainmodule 
--------------------------------------------------------------------------- 
ImportError        Traceback (most recent call last) 
/home/alexander/<ipython-input-1-cf4c9bafa487> in <module>() 
----> 1 from mymodule import mainmodule 

/home/alexander/build/bdist.linux-i686/egg/mymodule/mainmodule.py in <module>() 

ImportError: No module named subdir 

Tôi không thấy gì Tôi đã làm sai, khi tôi theo dõi một số Getting started tutorialrules for importing intra-packages. Tôi cho rằng sai lầm của tôi là một sai lầm rất nhỏ, nhưng tôi không thể phát hiện ra nó và giúp đỡ được đánh giá cao.

Trả lời

34

Bạn cần phải liệt kê tất cả các gói trong setup, bao gồm các gói con:

setup(
    name = "mytestmodule", 
    version = "0.0.1", 
    description = ("A simple module."), 
    packages=['mymodule', 'mymodule.subdir'], 
) 

Hoặc bạn có thể sử dụng setuptools 's chức năng kỳ diệu find_packages:

from setuptools import setup, find_packages 
setup(
    name = "mytestmodule", 
    version = "0.0.1", 
    description = ("A simple module."), 
    packages=find_packages(), 
) 

này được đề cập here:

If you have sub-packages, they must be explicitly listed in packages, but any entries in package_dir automatically extend to sub-packages. (In other words, the Distutils does not scan your source tree, trying to figure out which directories correspond to Python packages by looking for __init__.py files.)

+1

Đây có phải là mô tả ở đâu đó không? Có một số tài liệu về nội dung 'setup' trên' distutils' không?Nó không có vẻ dễ dàng để tìm tài liệu đại diện. – Alex

+0

Đã thêm liên kết vào ví dụ từ tài liệu. –

+0

Để tham khảo thêm chi tiết về cách 'package_dir' được sử dụng đệ quy để tìm các gói con, miễn là các gói con đó được liệt kê trong' gói', đọc [this] (https://docs.python.org/2/ distutils/setupscript.html # listing-whole-packages). –

5

Bạn cần chỉ định từng mô-đun của bạn một cách rõ ràng. Thay vì duy trì sự phức tạp của việc thêm mô-đun vào setup.py mọi lúc, bạn có thể sử dụng phương thức find_packages từ setuptools.

find_packages mất hai đối số tùy chọn:

  1. where đó là mặc định để '.' tức là curdir của bạn.
  2. exclude danh sách các công cụ để loại trừ

tôi thường có các bài kiểm tra trong repo của tôi, vì vậy tôi sử dụng:

from setuptools import find_packages 

packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]), 
0

tôi đã scriptname.py:main trong console_scripts setup.py tôi, .py là không cần thiết.

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