Python可以';在父目录中找不到模块
我有一个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
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?这是一篇很有明星价值的帖子:)