问题:无法在Python中导入我自己的模块
我很难理解模块导入在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
回答 0
在您的特定情况下,您似乎正在尝试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中。
回答 1
该函数import
在PYTHONPATH env中查找文件。变量和您的本地目录。因此,您可以将所有文件放在同一目录中,也可以将键入的路径导出到终端中:
export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"
回答 2
导出路径是一个好方法。另一种方法是将.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
回答 3
你可以试试
from myapp.myapp import SomeObject
因为您的项目名称与myapp.py相同,因此它会首先搜索项目文档
回答 4
在您的第一个myapp目录中,u可以添加setup.py文件,并在setup.py中添加两个python代码
from setuptools import setup
setup(name='myapp')
在命令行的第一个myapp目录中,使用pip install -e。安装软件包
回答 5
pip install
Windows 10上的默认设置为安装在“ Program Files / PythonXX / Lib / site-packages”中,该目录需要管理权限。因此,我通过以管理员身份运行pip install解决了我的问题 (即使您使用管理员帐户登录,也必须以管理员身份打开命令提示符)。另外,从python调用pip更安全。
例如python -m pip install <package-name>
代替pip install <package-name>
回答 6
就我而言,尽管Windows文件名不区分大小写,但Python导入却使Windows vs Python感到惊讶。因此,如果您有Stuff.py
文件,则需要按原样导入此名称。
回答 7
你需要
__init__.py
在所有您需要与之交互的代码的文件夹中。即使您尝试导入的文件处于同一级别,也需要在每次导入时指定项目的顶级文件夹名称。