Python在父目录中找不到模块

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (184)

我有一个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命令的方法不起作用?

注 - 上述示例使用Anaconda Python发行版在Mac上执行。还有一个类似的问题在Windows上运行Linux的VS机时,关于进口的问题。但是,我的问题与python在Mac上使用iPython vs 运行脚本有关。

提问于
用户回答回答于

上面from params import serial插入:

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

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

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

如果你希望能够导入paramscars/honda.py从那些家长目录运行脚本时project,您可以使用以下命令:

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]) )
用户回答回答于

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

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励