2016-09-03 54 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那样导入它。