2016-09-03 51 views
1

我想打包我的應用程序以在多個項目之間共享它。 我setup.py看起來是這樣的:無法導入使用distutils發佈的我自己的模塊

# -*- coding: utf-8 -*- 
from distutils.core import setup 

setup(
    name='foo_bar', 
    version='1.0', 
    py_modules=['foo_bar'], 
    install_requires=[ 
     'bitstring==3.1.5', 
     'pytz==2016.4', 
     'wheel==0.24.0', ] 
) 

然後我運行命令

python setup.py sdist 

創建我

我在用我的foo_bar這樣的應用程序的麻煩tar.gz文件。我通過PIP其安裝到獨立的virtualenv

pip install dist/foo_bar.tar.gz 

和PIP凍結的輸出表明,它是安裝

foo-bar==1.0 
bitstring==3.1.5 
pytz==2016.4 
wheel==0.24.0 

當我嘗試導入在Python控制檯這個模塊

import foo_bar 

我得到ImportError: No module named 'foo_bar'

我錯過了什麼?

編輯:

我的文件結構如下:

foo_bar 
├── dist 
│   └── foo_bar-1.0.tar.gz 
├── __init__.py 
├── MANIFEST 
├── bar.py 
├── requirements.txt 
├── setup.py 
+0

你還試過''安裝python setup.py嗎?你能提供你的目錄結構嗎?當你試圖導入你的模塊時,你是否在相同的virtualenv?你爲什麼使用''py_modules''而不是''packages''?這是更靈活... – ziky

+0

@ziky我已更新我的帖子,包括目錄結構。我使用單獨的virtualenv,但在那裏安裝了foo_bar。 TBH,我沒有聽說過'包'選項,可以使用它來代替py_module是否有所作爲? – mateuszb

+1

你試圖導入''foo_bar'',但是你的包裏沒有''foo_bar.py''!嘗試將'bar.py''重命名爲該名稱。但是我從來沒有使用過這種方式。通常你創建一個包('__init __。py''文件的目錄)與''setup.py''是同一層。這意味着,你將在你的項目中創建另一個''foo_bar''目錄,並且你會在這裏放置''bar.py''。然後你會像導入foo_bar.bar一樣導入它。 – ziky

回答

1

你能提供你的目錄結構?當你試圖導入你的模塊時,你是否在相同的virtualenv?你爲什麼使用py_modules而不是packages

此外,您正試圖導入foo_bar,但是您的包中沒有foo_bar.py!嘗試將bar.py重命名爲該名稱。

注意:我從來沒有用過這種包。通常你創建一個包(文件的目錄)與setup.py相同。這意味着,您將在您的項目中創建另一個foo_bar目錄,並且您將在此放置bar.py。然後你會像import foo_bar.bar那樣導入它。