如何导入Python文件?

如何导入Python文件?,python,python-3.x,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-wal

对不起,这肯定是重复的,但我找不到答案。我正在使用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'
文件“australia/new-south-wales/fetch.py”,第8行,在
从通用导入写入文件
ModuleNotFoundError:没有名为“common”的模块
如果我只是从公共导入writeFile执行
python-c“
,我看不到错误


解释器不应该吗?

在导入之前,需要导入的目录必须在该文件夹中有文件
\uuuu init\uuuuuuuuuuupy

#解决方案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
#解决方案2(将文件添加到其中一个python库)

另外,由于您有一个公共库,您可以运行

>>> import sys
>>> print sys.path
并查看您可以在每个项目中放置代码和使用哪些目录。您可以将公用包移动到此目录之一,并将其视为普通包。例如,对于common.py,如果您将其放置在此目录之一的根目录中,则可以像导入公用包一样导入

#解决方案3(使用相对导入)

然后转到父目录并运行

python -m home.australia.new-south-wales.fetch

根据描述,我假设您没有将其作为完整的python包运行,只是作为单独的文件运行

您可以使用完整的模块。这意味着将空的
\uuuuu init\uuuuu.py
添加到包含代码的目录中。您还必须将
新南威尔士
的名称更改为
新南威尔士
,因为它需要是一个有效的模块名称

假设
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
。如果指定,脚本将自动创建

现在,您正在包的上下文中启动代码,
fetch.py
可以执行以下操作:

from ..common import writeFile

您缺少模块的
\uuuu init\uuuu.py
。谢谢。这看起来很不雅观-有没有更好的方法在不同子目录中的脚本之间共享公共函数?(另外,我猜你的意思是
\uu init\uuuuuuuuuuuuuuupy
)我在
home/
中添加了一个空的
\uuuuuu init\uuuuuuuuuuuuuuuuuuuupy
文件,并且在
fetch.py
中添加了
scriptpath=“../common.py”
。我在尝试从
home/
运行
fetch.py
时仍然遇到错误。是的,我的意思是
\uuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy
;我也用这种方式;将scriptpath更改为
。/../“
谢谢,按照您的建议进行了更改,但仍然得到
模块NotFoundError:没有名为“common”的模块
,这也不符合PEP8-肯定有更好的方法吗?
from ..common import writeFile