如何导入Python文件?

时间:2017-07-03 17:22:43

标签: python python-3.x

对不起,这绝对是重复的,但我找不到答案。我在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"我没有看到错误。

不应该是翻译look in the current directory for modules吗?

2 个答案:

答案 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