【问题标题】:How to import Python file?如何导入 Python 文件?
【发布时间】:2017-12-07 01:07:40
【问题描述】:

对不起,这肯定是重复的,但我找不到答案。我正在使用 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吗?

【问题讨论】:

标签: python python-3.x


【解决方案1】:

在导入您需要导入的目录之前,该文件夹中必须有文件__init__.py

#solution 1(在运行时导入)

在“运行时”导入具有已知名称的特定 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

【讨论】:

  • 谢谢。这看起来很不雅 - 有没有更好的方法在不同子目录中的脚本之间共享通用功能? (另外,我猜你的意思是__init__.py?)
  • 我在home/ 中添加了一个空的__init__.py 文件,我在fetch.py 中添加了scriptpath = "../../common.py",后跟import common。尝试从 home/ 运行 fetch.py 时仍然出错。
  • 是的,我的意思是__init__.py;我也使用这种方式;将脚本路径更改为"../../"
  • 谢谢,按照您的建议进行了更改,但仍然得到ModuleNotFoundError: No module named 'common'
  • 这也不符合 PEP8 - 肯定有更好的方法吗?
【解决方案2】:

根据描述,我假设您没有将其作为完整的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2021-10-04
    • 2022-01-22
    相关资源
    最近更新 更多