gpt4 book ai didi

python - 在交互模式和非交互模式下相同代码中的不同导入行为 - 为什么模块搜索路径不同?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:07 26 4
gpt4 key购买 nike

这个问题与Can't import module with importlib.import_module有关,我认为这根本不是问题的根源。

我试图了解交互式解释器与非交互式脚本中使用的 importlib 存在差异的原因,因为我得到的结果各不相同。

我有一个包含 myscript.py 的文件夹,我希望它从子文件夹 my_subdir 中导入一个名为 module 的模块初始工作目录。我想通过进入那个目录并在那里工作来做到这一点。我知道还有其他解决方案可以访问子目录中的模块,但这是我想讨论的用例。

以下是 myscript.py 的内容,它只是移动到子目录并尝试从那里导入模块,然后从模块调用一些 hello-world 函数:

#!/home/chris/anaconda2/bin/python
import sys
import platform
import os
import importlib

print("Python version "+ platform.python_version())
print(sys.path)

os.chdir('my_subdir')
my_module = importlib.import_module('module')
my_module.my_function()

当我从命令行运行它时,Python 找不到该模块。导入系统似乎不知道 os.chdir() 的目录更改:

(base) chris@linux-om3m:~/workspace> python myscript.py 
Python version 2.7.15
['/home/chris/workspace', '/home/chris/anaconda2/lib/python27.zip', '/home/chris/anaconda2/lib/python2.7', '/home/chris/anaconda2/lib/python2.7/plat-linux2', '/home/chris/anaconda2/lib/python2.7/lib-tk', '/home/chris/anaconda2/lib/python2.7/lib-old', '/home/chris/anaconda2/lib/python2.7/lib-dynload', '/home/chris/anaconda2/lib/python2.7/site-packages', '/home/chris/anaconda2/lib/python2.7/site-packages']
Traceback (most recent call last):
File "myscript.py", line 11, in <module>
my_module = importlib.import_module('module')
File "/home/chris/anaconda2/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named module

但是,当我在交互式解释器中输入相同的脚本时,它工作正常:

(base) chris@linux-om3m:~/workspace> python
Python 2.7.15 | packaged by conda-forge | (default, Jul 2 2019, 00:39:44)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import platform
>>> import os
>>> import importlib
>>> print("Python version "+ platform.python_version())
Python version 2.7.15
>>> print(sys.path)
['', '/home/chris/anaconda2/lib/python27.zip', '/home/chris/anaconda2/lib/python2.7', '/home/chris/anaconda2/lib/python2.7/plat-linux2', '/home/chris/anaconda2/lib/python2.7/lib-tk', '/home/chris/anaconda2/lib/python2.7/lib-old', '/home/chris/anaconda2/lib/python2.7/lib-dynload', '/home/chris/anaconda2/lib/python2.7/site-packages', '/home/chris/anaconda2/lib/python2.7/site-packages']
>>> os.chdir('my_subdir')
>>> my_module = importlib.import_module('module')
>>> my_module.my_function()
Here I am!
>>>

我可以通过在执行 os 之后用 sys.path.append(os.getcwd()) 手动更新 sys.path 来解决这个问题.chdir - 但我不明白为什么这只在非交互模式下是必需的。

我唯一注意到的(并打印在粘贴的输出中)是在交互式解释器下,sys.path 有一个空字符串条目,而在非交互式模式下它包含我调用 python 的工作目录。

我知道我可以使用相对导入来解决这个问题,现在我正在使用 sys.path.append(os.getcwd()) 来解决这个问题,但我想了解为什么交互式运行与非交互式运行之间存在差异。

我在 Python 2.7 和 Python 3.6 上得到了相同的结果。

最佳答案

正如您在评论中指出的那样,将 '' 附加到 sys.path 可解决此问题。这是因为 '' 代表您的 cwd,所以 os.chdir() 知道在哪里可以正确找到您的子目录 my_subdir(参见 Why is the first element in python's sys.path an empty string?) .

my_subdir 使用绝对路径也应该可以解决您的问题。

关于python - 在交互模式和非交互模式下相同代码中的不同导入行为 - 为什么模块搜索路径不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58593077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com