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

n0p*_*0pe 121 python import module package

我很难理解模块导入如何在Python中工作(我以前从未用任何其他语言完成它).

比方说我有:

myapp/__init__.py
myapp/myapp/myapp.py
myapp/myapp/SomeObject.py
myapp/tests/TestCase.py
Run Code Online (Sandbox Code Playgroud)

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

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

TestCase.py
===================
from myapp import SomeObject
# some tests on SomeObject
Run Code Online (Sandbox Code Playgroud)

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

ImportError: No module named myapp
Run Code Online (Sandbox Code Playgroud)

Dav*_*son 80

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

import SomeObject
Run Code Online (Sandbox Code Playgroud)

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

from ..myapp import SomeObject
Run Code Online (Sandbox Code Playgroud)

但是,只有从包中导入TestCase时才会起作用.如果你想直接跑python TestCase.py,你将不得不弄乱你的道路.这可以在Python中完成:

import sys
sys.path.append("..")
from myapp import SomeObject
Run Code Online (Sandbox Code Playgroud)

虽然通常不建议这样做.

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

  • 我运行“pip install -e .”来安装 myapp,但是当尝试在 Visual Studio 代码中运行 TestCase 时,我仍然收到“ImportError:没有名为 myapp 的模块”。但如果我运行“python”,然后在 python 中运行“from myapp import SomeObject”,它就可以工作。我究竟做错了什么? (2认同)

Zen*_*non 35

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

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"
Run Code Online (Sandbox Code Playgroud)

  • 对于Windows用户,我们有"设置PYTHONPATH =%PYTHONPATH%; C:\ path_to_myapp\myapp\myapp \"而不是`export` (4认同)
  • 那我如何确保它对其他会使用它的人都有效呢?我宁愿不必告诉他们在运行之前设置某些环境变量。 (2认同)

jmo*_*oss 10

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

/Library/Python/2.7/site-packages
Run Code Online (Sandbox Code Playgroud)

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

/opt/awesome/custom_python_modules
Run Code Online (Sandbox Code Playgroud)


小智 10

你需要有

__init__.py
Run Code Online (Sandbox Code Playgroud)

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


小智 7

你可以试试

from myapp.myapp import SomeObject
Run Code Online (Sandbox Code Playgroud)

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


未来陆*_*投资人 6

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

from setuptools import setup
setup(name='myapp')
Run Code Online (Sandbox Code Playgroud)

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