对不起,这绝对是重复的,但我找不到答案。我在Python 3中工作,这是我的应用程序的结构:
/home
common.py
australia/
new-south-wales/
fetch.py
我在home/
目录中,正在运行fetch.py
。如何从该脚本中的common.py
导入函数?
我已按如下方式设置fetch.py
:
from common import writeFile
但是我收到以下错误:
File "australia/new-south-wales/fetch.py", line 8, in <module>
from common import writeFile
ModuleNotFoundError: No module named 'common'
如果我只是python -c "from common import writeFile"
我没有看到错误。
答案 0 :(得分:6)
在导入之前,需要导入的目录必须在该文件夹中包含文件__init__.py
#solution 1 (在运行时导入)
使用已知名称在'runtime'导入特定的Python文件:
import os
import sys
script_dir = "/path/to/your/code/directory"
# Add the absolute directory path containing your
# module to the Python path
sys.path.append(os.path.abspath(script_dir))
import filename
#solution 2 (将文件添加到其中一个python库)
另外,因为您有一个可以运行的公共库
>>> import sys
>>> print sys.path
并查看您可以在每个项目中放置代码和使用的目录。您可以将公共包移动到其中一个目录并将其视为普通包。例如,如果将common.py放在一个根目录中您可以导入此目录之一的目录,如import common
#solution 3 (使用相对导入)
# from two parent above current directory import common
# every dot for one parent directory
from ... import common
然后转到父目录并运行
python -m home.australia.new-south-wales.fetch
答案 1 :(得分:1)
从描述中我假设你没有将它作为完整的python包运行,就像单独的文件一样。
您可以使用完整的模块。这意味着将空__init__.py
添加到包含代码的目录中。您还必须将new-south-wales
的名称更改为new_south_wales
,因为它必须是有效的模块名称。
假设home
是您应用的名称,您最终应该:
home/
__init__.py
common.py
australia/
__init__.py
new_south_wales/
__init__.py
fetch.py
接下来,您需要为您的应用启动脚本 - 这意味着要么像以下一样简单:
#!/usr/bin/env python
from australia.new_south_wales import fetch
fetch.your_main_function()
或者您可以添加包含完整包描述的setup.py
。如果指定entry points,则会自动创建脚本。
现在,您已经在程序包的上下文中启动了代码,fetch.py
可以执行此操作:
from ..common import writeFile