当前位置: 首页 > 面试题库 >

加载模块时使用sys.path.insert(0,path)和sys.path(append)的效果

林博厚
2023-03-14
问题内容

我最近遇到了python
ImportError问题,该模块在本地计算机上运行时在模块中找到,但在CI服务器上找不到。我通过sys.path.append(path)在脚本中将字符串模块位置替换为sys.path.insert(0, path)wherepath来解决了这个问题。

由于这是我的模块,而不是已安装的软件包(相关问题),为什么路径顺序可以解决此问题?


问题答案:

因为python从sys.path列表的第一个目录开始按顺序检查目录,直到找到要查找的.py文件为止。

理想情况下,当前目录或脚本目录始终是列表中的第一个元素,始终是第一个元素,除非像您一样对其进行修改。从文档-

在程序启动时进行初始化,该列表的第一项path
[0]是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用(例如,如果交互式调用解释器或从标准输入中读取脚本),则path
[0]为空字符串,该字符串将引导Python首先搜索当前目录中的模块。请注意,由于PYTHONPATH的结果,在插入条目之前插入了脚本目录。

因此,最有可能的是,.py在当前目录(运行脚本的位置)中,有一个文件与您要从中导入的模块同名。

另外,要注意有关ImportErrors的问题,可以说导入错误说–ImportError: No module named main这并不意味着s
main.py被覆盖,不,如果被覆盖我们就不会在尝试读取它时遇到问题。其上方的某些模块被覆盖。py或其他文件。

范例-

我的目录结构看起来像-

 - test
    - shared
         - __init__.py
         - phtest.py
  - testmain.py

现在,从testmain.py,我打电话给from shared import phtest,它工作正常。

现在假设我在test目录`中引入了shared.py ,例如-

 - test
    - shared
         - __init__.py
         - phtest.py
  - testmain.py 
  - shared.py

现在,当我尝试从中执行操作from shared import phtesttestmain.py,我会收到错误消息-

ImportError: cannot import name 'phtest'

如您在上面看到的,引起问题的文件shared.py不是phtest.py



 类似资料:
  • 问题内容: 编辑: 根据Ulf Rompe的评论, 重要的是使用“ 1”而不是“ 0” ,否则将破坏sys.path。 我已经使用Python已有一段时间了(一年多),对于为什么人们建议您使用而不是,我一直感到困惑。让我示范一下。 假设我正在开发一个名为PyWorkbooks的模块(该模块已安装在我的计算机上),但是同时我正在开发一个包含PyWorkbooks的模块(例如PyJob)。当我在PyJ

  • egg 单文件上传 获取路径:path.dirname(filepath) const path=require("path"); var filepath='/node/base/path/test.js'; console.log( path.dirname(filepath) ) //输出/node/base/path 获取文件名:path.basename(filename) cons

  • 不管是用import还是用from mmmm import *的方式导入模块,当程序运行之后,回头在看那个存储着mmmm.py文件的目录中(关于mmmm.py文件可以看上一讲),多了一个文件: qw@qw-Latitude-E4300:~/Documents/ITArticles/BasicPython/codes$ ls mmm* mmmm.py mmmm.pyc 在这个目录下面,除了原来的

  • 问题内容: 我正在使用:IntelliJ IDEA 11.1.3(社区版)和Maven 3.0.4。 该项目包含几个模块,其中一个模块创建一个war文件。当我使用“ mvn idea:idea”时,IntelliJ由于某种原因无法加载此模块。错误消息是:“ 10:40:04 AM错误加载项目:无法加载模块” 我可以通过手动导入现有模块来解决此问题,但这是一个非常烦人的问题。有谁知道为什么会这样,这

  • 本文向大家介绍seaJs的模块定义和模块加载浅析,包括了seaJs的模块定义和模块加载浅析的使用技巧和注意事项,需要的朋友参考一下 SeaJS 是由玉伯开发的一个遵循 CommonJS 规范的模块加载框架,可用来轻松愉悦地加载任意 JavaScript 模块和css模块样式。SeaJS非常小巧,小巧在于压缩和gzip后体积只有4K,而且接口和方法也非常少,SeaJS 就两个核心:模块定义和 模块的

  • 为了显示这种关系,让我们开始定义一个简单的模块,作为我们的示例应用程序的根模块。 app/app.module.ts 到目前为止,这是一个非常常见的模块,依赖于,有一个路由机制和两个组件:AppComponent和EagerComponent。 现在,让我们专注于定义导航的应用程序(AppComponent)的根组件。 app/app.component.ts import { Component