为啥我的脚本目录不在 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 中工作而不在脚本中工作?