为啥我的脚本目录不在 Python sys.path 中?

Posted

技术标签:

【中文标题】为啥我的脚本目录不在 Python sys.path 中?【英文标题】:Why is my script's directory not in the Python sys.path?为什么我的脚本目录不在 Python sys.path 中? 【发布时间】:2018-12-26 10:32:30 【问题描述】:

Python 3.6.5 我知道这个:Why does my python not add current working directory to the path? 但问题在于他正在做一些更复杂的事情(指的是子文件夹但从主文件夹执行)。答案是要么简化事情,要么添加包定义。

所选答案甚至说:“这是添加的脚本目录”

但是,我的问题实际上更简单:我的脚本目录没有添加。

基本上,网上所有的教程都说:import mymodule 当我这样做时,我得到一个名称错误...

我的文件夹结构:

C:/Projects/interner
    interner.py   # this is the main program body
    aux.py        # this is the auxiliary file I would like to import into the above

我已经尝试过在 interner.py 中编写“import aux”,也尝试过使用交互式控制台:

cd c:/Projects/interner
python
import aux

无济于事(ModuleNotFoundError: No module named 'aux')

我的系统路径:

['C:\\Tools\\Python\\python365\\python36.zip', 'C:\\Tools\\Python\\python365']

(来自脚本内部和交互式控制台)

你能告诉我为什么我不能导入本地脚本吗?是因为我的 sys.path 缺少 PWD 吗?如果有,为什么会丢失?

编辑:这样做有助于调查:

>>> import os; print(os.listdir("."))
['aux.py', 'hw.py', 'interner.py', 'my_funcs.py']

【问题讨论】:

不,我认为 sys.path 没有当前工作目录是正常的。无论如何,它仍然应该在导入过程中被搜索。 import aux 怎么样?这样效果更好吗? 这是import aux,而不是import aux.py。包含您的代码的目录隐式添加到搜索路径中,即使您的工作目录不是。 不,请不要关闭,错字在问题中,不是我的代码 抱歉无法重现。如果aux.py 在当前目录中import aux 有效。期间 我相信这是一个 Python 错误,特定于可嵌入(没有安装程序的 ZIP 文件)Windows 发行版。我已经提交了bugs.python.org/issue34841。 【参考方案1】:

我相信这是一个 Python 错误,特定于可嵌入(没有安装程序的 ZIP 文件)Windows 发行版。我已经提交了https://bugs.python.org/issue34841。

从发行版中删除 python37._pth 文件(在你的情况下可能是 python36._pth)为我修复了它。

【讨论】:

【参考方案2】:

我不知道为什么,但您的sys.path 变量中似乎缺少"",这会阻止从当前目录导入模块!

我可以以某种方式重现您的问题(eatcpu.py 在我当前的目录中):

$ python.exe
Python 2.7.8 (default, Jun 30 2014, 16:08:48) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', 'C:\\Windows\\system32\\python27.zip', 'D:\\AppX64\\Python27\\DLLs', ... etc...]
>>> import eatcpu

有效。现在在另一个 python 会话中:

$ python.exe
Python 2.7.8 (default, Jun 30 2014, 16:08:48) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.remove("")
>>> import eatcpu
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named eatcpu
>>>

所以你的快速修复是:

import sys
sys.path.append("")

【讨论】:

此变通方法有帮助。我现在 99% 确信这是因为我使用的是可嵌入版本并且我的安装不完整(基本上,我只是将 python 可执行位置添加到我的 Windows 系统路径中,仅此而已)。如果您有兴趣了解问题,可以下载可嵌入版本,然后尝试重现。如果你也能想到缺少的安装步骤,今晚我为你喝一杯 很有可能。这就是为什么似乎没有人相信你。但是系统路径中缺少“空字符串”这一事实是原因。【参考方案3】:

看起来您使用的是 CPython 的可嵌入发行版,而不是常规安装程序之一。如the documentation page 所述:

嵌入式分发是一个包含最小 Python 环境的 ZIP 文件。它旨在充当另一个应用程序的一部分,而不是由最终用户直接访问。

由于您似乎是直接访问 Python 而不是嵌入它,因此您应该考虑使用常规(或 Microsoft Store)安装程序(也在我上面链接的页面上进行了描述)。

【讨论】:

【参考方案4】:

试着明确表达:

from . import aux

【讨论】:

1.感谢您的回答 2. 该建议不起作用: ImportError: cannot import name 'aux22' 3. 我并不是真的在寻找解决方法。我只是在学习python(显然),如果我不了解路径和导入之类的基本知识,我将来肯定会失败 您尝试在代码中的哪个位置导入aux22?是您尝试在 aux.py 中导入的另一个模块,还是一个错字? interner.py 代码的字面意思是:“import aux”。 aux22 确实是笔误,抱歉 aux.py 中有什么内容? aux22 引用在哪里? 对不起,aux22 只是因为我在尝试不同的东西。从那以后我删除了它,它没有被任何地方引用。现在只有这两个文件:interner.py,其中包含:“import aux”和 aux.py,其中包含:“def printman(): print("Aux is here.")”

以上是关于为啥我的脚本目录不在 Python sys.path 中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 python 模块在 shell 中工作而不在脚本中工作?

Python 问题在脚本中导入我的文件(不在控制台中)

为啥 Asp.Net MVC 不在我的共享目录中搜索视图?

为啥不在 Python 中导入转换器?

脚本 sqlformat.exe 安装在目录中,该目录不在 PATH 上

当 XAMPP 不在分区的根目录中时,为啥它不能工作?