【问题标题】:Python can't find module in parent directoryPython在父目录中找不到模块
【发布时间】:2019-01-04 16:44:56
【问题描述】:

我有一个 Python 项目的文件夹结构如下:

proj/
├── cars
│   ├── honda.py
│   └── volvo.py
├── trucks
│   ├── chevy.py
│   └── ford.py
├── main.py
└── params.py

params.py的内容:

""" Parameters used by other files. """

serial = '12-411-7843'

honda.py的内容:

""" Information about Honda car. """

from params import serial

year = 1988
s = serial

print('year is', year)
print('serial is', s)

proj/ 文件夹中,我可以使用 iPython 运行脚本:

$ cd path/to/proj/
$ ipython

In [1]: run cars/honda.py
year is 1988
serial is 12-411-7843

如果我尝试使用python 命令运行脚本,则会收到params.py 的模块未找到错误:

$ cd path/to/proj/
$ python cars/honda.py
Traceback (most recent call last):
  File "cars/honda.py", line 5, in <module>
    from params import serial
ModuleNotFoundError: No module named 'params'

为什么使用python 命令的方法不起作用?

注意 - 上面的示例是在 Mac 上使用 Anaconda Python 发行版执行的。在 Windows 和 Linux 机器上运行时,有一个类似的 question 关于导入问题。但是,我的问题与在 Mac 上使用 iPython vs python 运行脚本有关。

【问题讨论】:

  • @Dyno 我编辑了我的问题以解释与可能重复问题的区别。
  • @wigging 我下面的解决方案对你有用吗?如果没有,你能说为什么不吗?
  • @wigging 谢谢,我完全错过了这一区别,目前的答案似乎都在使用相同的思路。希望您的修改将有助于找到解决方案。

标签: python python-3.x ipython


【解决方案1】:

以上from params import serial插入:

import sys
[sys.path.append(i) for i in ['.', '..']]

这会将您当前的工作目录及其父目录添加到您可以从中导入的位置列表中。

proj 的父目录运行脚本时处理导入

如果您希望在从project 的父目录运行脚本时能够将params 导入cars/honda.py,您可以使用以下命令:

import sys
import os
from functools import reduce

# allow imports when running script from within project dir
[sys.path.append(i) for i in ['.', '..']]

# allow imports when running script from project dir parent dirs
l = []
script_path = os.path.split(sys.argv[0])
for i in range(len(script_path)):
  sys.path.append( reduce(os.path.join, script_path[:i+1]) )

【讨论】:

  • 这适用于proj/ 文件夹。有没有办法让它相对于运行的脚本的路径工作?
  • @wigging 我更新了我的回复以处理您从 proj/ 的父目录运行脚本的情况,这有帮助吗?一般情况下,只需使用sys.path.append() 添加到可以从中导入资源的路径列表...
  • 那么为什么 iPython 能够找到文件但 python 命令需要定义路径?
  • @wigging 您在哪里启动了 ipython 服务器,您在使用 ipython 之前、期间或之后是否修改了路径?
  • 这是一个值得明星的帖子:)
【解决方案2】:

如果您希望引用基本proj 目录的导入,则必须将PYTHONPATH 设置为该目录。目前honda.py 在它自己的module 中寻找一个名为paramsmoudule

~$ cd path/to/project
~$ PYTHONPATH=$(pwd)

您也可以使用relative imports

【讨论】:

    【解决方案3】:

    位置问题,你应该为params.py写完整路径。 ipython有一个字符可以使用linux命令。所以首先你cd目录,解释器可以找到params.py。 但是命令 python 需要 params.py 的完整路径。 所以这就是你无法运行处理的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-10
      • 2021-10-05
      • 2015-12-03
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2022-12-07
      相关资源
      最近更新 更多