【问题标题】: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

标签: python python-3.x import python-import


【解决方案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.")”
      猜你喜欢
      • 2010-11-09
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 2013-04-29
      • 2017-05-30
      相关资源
      最近更新 更多