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

13
Python 3.6.5
我知道这个问题:为什么我的Python没有将当前工作目录添加到路径中? 但那里的问题更加复杂(涉及到从主文件夹中引用子文件夹)。那里的答案是要么简化事情,要么添加包定义。
而且,选定的答案甚至说:“被添加的是脚本所在的目录”。
然而,我的问题确实更简单:我的脚本所在的目录没有被添加。
基本上,所有的互联网教程都说: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:找不到名为'aux'的模块)
我的sys.path:
['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']

1
不要关闭,请注意,打字错误在问题中,而不是我的代码中。 - Kiichiro Matsushita
1
抱歉无法再现。如果aux.py在当前目录中,import aux就可以工作。句号。 - Jean-François Fabre
cd c:/Projects/interner doesn't change the drive. Are you sure the current directory is C: ... ? I'd try cd /D c:/Projects/interner - Jean-François Fabre
@Jean-FrançoisFabre,感谢您的研究。我不明白第一个是如何重复的。我没有包或PYTHONPATH或__init__.py...我正在做一些非常简单的事情,每个人都说应该可以工作,但它并没有,我不知道哪里出了问题。第二个对我来说仍然很令人沮丧,因为它也说:“为了确保b从自己的包中导入a,只需要在b中编写以下内容:import a”,但这根本行不通。 - Kiichiro Matsushita
2
我认为这是Python的一个bug,特定于可嵌入的(没有安装程序的ZIP文件)Windows发行版。我已经提交了https://bugs.python.org/issue34841。 - Simon Sapin
显示剩余10条评论
4个回答

10

我认为这是一个Python的bug,特指嵌入式(没有安装程序的ZIP文件)Windows分发。我已经提交了https://bugs.python.org/issue34841来报告。

从分发中删除python37._pth文件(在您的情况下可能是python36._pth),可以解决该问题。


1
我不知道为什么,但是似乎你的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系统路径中,仅此而已)。如果你有兴趣知道问题所在,你可以下载可嵌入版本,然后尝试复制。如果你也能想到缺失的安装步骤,今晚我会为你喝彩。 - Kiichiro Matsushita
这是非常可能的。这就是为什么没有人相信你的原因。但是,“空字符串”在系统路径中缺失是导致问题的原因。 - Jean-François Fabre

0

看起来你正在使用CPython的可嵌入版本而不是常规的安装程序之一。如文档页面所述:

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

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


-2

尝试明确表达:

from . import aux

  1. 感谢您的回答。
  2. 这个建议不起作用:ImportError: 无法导入名称 'aux22'。
  3. 我并不是在寻找解决方法。我只是在学习Python(显然),如果我不能理解像路径和导入这样基本的东西,我肯定会在未来失败。
- Kiichiro Matsushita
1
你的代码中在哪里尝试导入 aux22?它是你在 aux.py 中尝试导入的另一个模块,还是打错了? - blhsing
interner.py的代码实际上是:"import aux"。aux22确实是一个拼写错误,抱歉。 - Kiichiro Matsushita
抱歉,aux22只是因为我在尝试不同的东西。此后我已将其删除,并且没有任何地方引用它。现在只有这两个文件:interner.py,其中包含:“import aux”,以及aux.py,其中包含:“def printman():print(“Aux is here.”)”。 - Kiichiro Matsushita
它只显示一个空行:>>> exec(open('aux.py').read())
- Kiichiro Matsushita
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接