32

setup.pyPython パッケージのセットアップに問題があります。まず、次のディレクトリ設定があります。

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

つまり、プロジェクト ディレクトリにはsetup.pyと ディレクトリが含まれており、このディレクトリmymodule自体には 2 つのディレクトリに 2 つの Python モジュールが含まれています。ファイルsubmodule.pyには

teststring = "hello world"

mainmodule.py内容:

from .subdir import submodule
mainstring = "42"

含まれるものsetup.py:

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

from from withinを使用するfrom mymodule import mainmoduleと、動作は期待どおりに機能し、たとえばstring を参照できます。ipythonsourceTestmainmodule.submodule.teststringhello world

一方、この「パッケージ」を使用してインストールpython setup.py installし、(他のディレクトリ内から) 同じことをしようとすると、インポート エラーが発生します。

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

Getting started tutorial and rules for importing intra-packagesに従ったので、私が何を間違ったのかわかりません。私の間違いは本当に小さなものだと思いますが、それを見つけることができず、助けていただければ幸いです。

4

3 に答える 3

50

setupサブパッケージを含むすべてのパッケージを にリストする必要があります。

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

setuptoolsまたは、のマジック関数を使用できますfind_packages

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

これはここで言及されています:

サブパッケージがある場合、パッケージに明示的にリストする必要がありますが、package_dir 内のすべてのエントリは自動的にサブパッケージに拡張されます。(つまり、Distutils はソース ツリーをスキャンせず、ファイルを検索して Python パッケージに対応するディレクトリを特定しようとします__init__.py。)

于 2013-03-12T17:32:02.200 に答える
6

各モジュールを明示的に指定する必要があります。毎回 setup.py にモジュールを追加するという複雑さを維持する代わりに、 のfind_packagesメソッドを使用できますsetuptools

find_packages2 つのオプションの引数を取ります。

  1. where'.'つまり、curdir のデフォルトです。
  2. exclude除外するもののリスト

通常、レポにはテストがあるため、次を使用します。

from setuptools import find_packages

packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
于 2015-05-10T18:17:54.997 に答える