2011-04-28 74 views
2

我想安裝一個簡單的python庫,我創建並認爲我可能會缺少一個步驟。設置正常(或至少運行),但是當我導入它不工作,因爲我期望。 目錄結構看起來像setup.py導入不能正常工作


Foo/ 
    setup.py 
    README.txt 
    LICENSE.txt 
    foo/ 
     __init__.py 
     bar.py 

我可以做

>>> import foo

但當時如果我嘗試

>>> foo.bar

我收到以下錯誤

AttributeError: 'module' object has no attribute 'bar'

反之不Ë如果我使用

>>> from foo import bar

rrors發生這裏是我的setup.py


from distutils.core import setup 

setup(
    name='Foo', 
    version='0.1.0', 
    author='ctrl-c', 
    author_email='[email protected]', 
    packages=['foo'], 
    license='LICENSE.txt', 
    description='Foo does bar.', 
    long_description=open('README.txt').read(), 
) 

我想我只是錯過了一些東西,但我一直在尋找通過文檔,並沒有發現它。謝謝。

回答

1

你的setup.py顯示正常。你如何安裝你的軟件包?例如:

% cd Foo 
% python setup.py install --root /tmp/fooroot 
% PYTHONPATH=/tmp/fooroot python -c 'from foo import bar; print bar' 
<module 'foo.bar' from 'foo/bar.py'> 

如果你是一個基於RPM的系統上使用你這個可以創建一個可安裝RPM:

% python setup.py bdist_rpm 
% sudo rpm -i dist/Foo-0.1.0-1.noarch.rpm 
# now should be available to python globally 

如果你想bar符號可見作爲foo屬性默認情況下,這樣做:

foo/__init__.py

import bar 
+1

將import foo添加到__init__.py正是我所期待的。謝謝 – ctrlc 2011-04-28 16:41:48

+0

這對於大多數包來說都是非常普遍的做法,也就是說我可以'輸入numpy'並且在numpy.linalg'沒有任何問題。 – ctrlc 2011-04-28 16:49:11

+0

你說得對。許多軟件包作者選擇從軟件包本身導出常用符號。最好將這些模塊實現爲模塊並通過'__init __。py'暴露它們,即不要直接在'__init __。py'中實現類/函數,只是用它來控制哪些符號是包名稱空間的一部分。 – samplebias 2011-04-28 16:53:50

1

foo是一個軟件包,軟件包不會自動導入模塊。你必須明確地做。這就是Python的工作原理。然後你也可以做import foo.bar和參考foo.bar

1

,如果你想要做這樣的事情,你必須填寫的富/ __ init__.py有:

import bar 

然後,導入FOO時,你將能夠foo.bar

否則使用,使用

import foo.bar