我很难理解模块导入在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 :(得分: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)
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