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


141

我很难理解模块导入在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

Answers:


95

在您的特定情况下,您似乎正在尝试SomeObject从myapp.py和TestCase.py脚本导入。在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中


我尝试只import在我中使用,TestCase.py但是它仍然给我同样的错误。我假设这是因为它在__init__.py?的子目录中。
n0pe 2012年

哦,等等,我想我明白了。如果我的测试用例是从软件包中调用的,我将能够使用from ... import ...正确的代码?
n0pe 2012年

1
仅当从包装外部导入from myapp.tests import TestCase from a script outside myapp. If you're running TestCase时,您才会这样做
David Robinson,

1
我运行了“ pip install -e”来安装myapp,但是当尝试在Visual Studio代码中运行TestCase时,我仍然收到“ ImportError:没有名为myapp的模块”。但是,如果我运行“ python”,然后在python中运行“从myapp import SomeObject”,则可以运行。我究竟做错了什么?
dagrun

@DavidRobinson我使用了您提到的方法,该方法执行后未显示任何错误from fodername import file_name_of_my_py_code,但是当我尝试访问其中定义的对象时,file_name_of_my_py_code.py他说NameError: name 'ClassName' is not defined
Kavin Raju S

44

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

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

2
那我如何确保它对其他会使用它的人都有效呢?我宁愿不必告诉他们在运行之前设置某些环境变量。
n0pe 2012年

1
当前目录位于pythonpath中,因此只要脚本位于相同的文件夹/目录中,它就可以正常工作。不幸的是,每个脚本都位于单独的目录中。
JKirchartz

4
对于Windows用户,不是export我们设置了“ PYTHONPATH =%PYTHONPATH%; C:\ path_to_myapp \ myapp \ myapp \”
love.by.Jesus

在vs代码中,我可以通过将PYTHONPATH Env变量添加到launch.json中来解决此问题:“ env”:{“ PYTHONPATH”:“ $ {workspaceFolder}”}
Michael Armitage

11

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

/Library/Python/2.7/site-packages

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

/opt/awesome/custom_python_modules

1
如果我在Windows中工作,该怎么办
Nwawel A Iroume

我不确定。如果您使用的是Windows。查找一些vm软件并使用linux。或者-有关在Windows中导出变量的信息,请参见此答案。stackoverflow.com/questions/559816/...
jmontross

这正是我所需要的
Lee88 '17

1
很高兴听到@ Lee88-花了我一段时间自己弄清楚了:)
jmontross

9

你可以试试

from myapp.myapp import SomeObject

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


3

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

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

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


2

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


0

就我而言,尽管Windows文件名不区分大小写,但Python导入却使Windows vs Python感到惊讶。因此,如果您有Stuff.py文件,则需要按原样导入此名称。


0

你需要

__init__.py

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.