无法在Python中导入我自己的模块

时间:2012-02-21 18:27:20

标签: python import module package

我很难理解模块导入在Python中是如何工作的(我之前从未使用任何其他语言)。

让我说我有:

myapp/__init__.py
myapp/myapp/myapp.py
myapp/myapp/SomeObject.py
myapp/tests/TestCase.py

现在我想尝试这样的事情:

myapp.py
===================
from myapp import SomeObject
# stuff ...

TestCase.py
===================
from myapp import SomeObject
# some tests on SomeObject

但是,我肯定做错了,因为Python看不到myapp是一个模块:

ImportError: No module named myapp

9 个答案:

答案 0 :(得分:78)

在您的特定情况下,您似乎尝试从myapp.py和TestCase.py脚本中导入SomeObject。从myapp.py,做

import SomeObject

因为它在同一个文件夹中。对于TestCase.py,请执行

from ..myapp import SomeObject

但是,只有从包中导入TestCase时才会起作用。如果你想直接运行python TestCase.py,你必须弄乱你的路径。这可以在Python中完成:

import sys
sys.path.append("..")
from myapp import SomeObject

虽然通常不推荐这样做。

通常,如果您希望其他人使用您的Python包,您应该使用distutils来创建安装脚本。这样,任何人都可以使用像python setup.py install这样的命令轻松安装您的软件包,并且它可以在他们的机器上随处可用。如果你认真对待这个包,你甚至可以将它添加到Python包索引PyPI

答案 1 :(得分:30)

函数import在PYTHONPATH环境中查找文件。变量和您的本地目录。因此,您可以将所有文件放在同一目录中,也可以将路径输入导入终端::

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"

答案 2 :(得分:9)

导出路径是一个好方法。另一种方法是将.pth添加到您的站点包位置。    在我的Mac上,我的python将site-packages保存在/ Library / Python中,如下所示

/Library/Python/2.7/site-packages

我在/Library/Python/2.7/site-packages/awesome.pth创建了一个名为awesome.pth的文件,并在文件中放入了引用我真棒模块的以下路径

/opt/awesome/custom_python_modules

答案 3 :(得分:5)

你可以尝试

from myapp.myapp import SomeObject

因为您的项目名称与myapp.py相同,这使得它首先搜索项目文档

答案 4 :(得分:2)

在你的第一个myapp目录中,你可以添加一个setup.py文件并在setup.py中添加两个python代码

from setuptools import setup
setup(name='myapp')

在命令行的第一个myapp目录中,使用pip install -e。安装包

答案 5 :(得分:1)

Windows 10上的

pip install默认安装在“ Program Files / PythonXX / Lib / site-packages”中,该目录是需要管理特权的目录。因此,我通过以管理员身份运行pip install 解决了我的问题(即使您使用管理员帐户登录,也必须以管理员身份打开命令提示符)。另外,从python调用pip更安全。
例如
python -m pip install <package-name>
代替
pip install <package-name>

答案 6 :(得分:1)

您需要

__init__.py

在具有您需要与之交互的代码的所有文件夹中。 即使您尝试导入的文件处于同一级别,也需要在每次导入时指定项目的顶级文件夹名称。

答案 7 :(得分:0)

在我的情况下,它是Windows vs Python的惊喜,尽管Windows文件名不区分大小写,但Python导入却是。因此,如果您有Stuff.py文件,则需要按原样导入此名称。

答案 8 :(得分:0)

假设我写了一个模块

import os
my_home_dir=os.environ['HOME'] // in windows 'HOMEPATH'
file_abs_path=os.path.join(my_home_dir,"my_module.py")

with open(file_abs_path,"w") as f:
   f.write("print('I am loaded successfully')")

import importlib
importlib.util.find_spec('my_module') ==> cannot find

我们必须告诉python在哪里寻找模块。我们必须将路径添加到sys.path

 import sys
 sys.path.append(file_abs_path)

现在importlib.util.find_spec('my_module')返回:

  ModuleSpec(name='my_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7fa40143e8e0>, origin='/Users/name/my_module.py')

我们创建了我们的模块,我们告知python它的路径,现在我们应该能够导入它了

 import my_module

//I am loaded successfully