Python可以';在父目录中找不到模块

Python可以';在父目录中找不到模块,python,python-3.x,ipython,Python,Python 3.x,Ipython,我有一个Python项目的文件夹结构,如下所示: proj/ ├── cars │   ├── honda.py │   └── volvo.py ├── trucks │   ├── chevy.py │   └── ford.py ├── main.py └── params.py 参数py的内容: """ Parameters used by other files. """ serial = '12-411-7843' """ Information about Honda car

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

proj/
├── cars
│   ├── honda.py
│   └── volvo.py
├── trucks
│   ├── chevy.py
│   └── ford.py
├── main.py
└── params.py
参数py的内容

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

serial = '12-411-7843'
""" Information about Honda car. """

from params import serial

year = 1988
s = serial

print('year is', year)
print('serial is', s)
$ 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'
本田.py的内容:

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

serial = '12-411-7843'
""" Information about Honda car. """

from params import serial

year = 1988
s = serial

print('year is', year)
print('serial is', s)
$ 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'
proj/
文件夹中,我可以使用iPython运行脚本:

$ cd path/to/proj/
$ ipython

In [1]: run cars/honda.py
year is 1988
serial is 12-411-7843
如果我尝试使用
python
命令运行脚本,我会得到
params.py
的模块未找到错误:

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

serial = '12-411-7843'
""" Information about Honda car. """

from params import serial

year = 1988
s = serial

print('year is', year)
print('serial is', s)
$ 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'
$cd路径/to/proj/
$python cars/honda.py
回溯(最近一次呼叫最后一次):
文件“cars/honda.py”,第5行,在
从参数导入序列
ModuleNotFoundError:没有名为“params”的模块
为什么使用
python
命令的方法不起作用


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

如果要引用基本
proj
目录的导入,必须将设置为该目录。目前,本田.py
正在其自身的
模块中查找名为
params
moudule

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

或者你也可以使用

如果要引用基本
proj
目录的导入,必须将设置为该目录。目前,本田.py
正在其自身的
模块中查找名为
params
moudule

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

或者你也可以使用

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

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

以上
来自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]) )

以上
从参数导入序列插入:

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]) )

可能重复的@Dyno我编辑了我的问题,以解释与可能重复的问题之间的差异。@wigging我下面的解决方案对您有用吗?如果没有,你能说为什么没有吗?@wigging谢谢,我完全错过了这一区别&目前的答案似乎都使用了相同的思路。希望您的编辑将有助于找到解决方案。@Dyno的可能重复我编辑了我的问题,以解释与可能重复的问题的区别。@wigging下面的解决方案对您有用吗?如果没有,你能说为什么没有吗?@wigging谢谢,我完全错过了这一区别&目前的答案似乎都使用了相同的思路。希望您的编辑将有助于找到解决方案。这在
proj/
文件夹中起作用。有没有办法使它相对于运行的脚本路径工作?@wigging我更新了我的响应,以处理您从
proj/
的父目录运行脚本的情况,这有帮助吗?一般来说,只需使用
sys.path.append()
添加到可从中导入资源的路径列表中…那么为什么iPython能够找到文件,但
python
命令需要定义路径?@wigging您在哪里启动了iPython服务器,之前是否修改了路径,或者是因为使用了ipython?这是一篇很有明星价值的帖子:)这篇文章在
proj/
文件夹中运行。有没有办法使它相对于运行的脚本路径工作?@wigging我更新了我的响应,以处理您从
proj/
的父目录运行脚本的情况,这有帮助吗?一般来说,只需使用
sys.path.append()
添加到可从中导入资源的路径列表中…那么为什么iPython能够找到文件,但
python
命令需要定义路径?@wigging您在哪里启动了iPython服务器,之前是否修改了路径,或者是因为使用了ipython?这是一篇很有明星价值的帖子:)