#0>", line 1, in <module> import treenames ImportError: No module named 'treenames' 这是因为您的工作目录并不在sys.path
通过上述代码即首先获取当前目录,使用sys.path将要导入的package或module加入到PATH环境变量中。 os.path.dirname() #返回目录路径 2.sys.path —— 动态地改变Python搜索路径 如果python中导入的package或module不在环境变量PATH中,那么可以使用sys.path
多个python环境导致调包失败 虽然多个site-packages下都安装成功了 但是不知道为何jupyter 里import部分 包还是报错 no model
使用pycharm时, pycharm会自动把我们新建的每个项目都加入到sys.path路径中, 我们在使用过程中根本不涉及项目路径的处理, 但是当项目部署到linux上时, 问题就来了, linux上可没有
如果是要获得当前执行的脚本的所在目录位置,那么需要使用sys模块的sys.path[0]变量或者sys.argv[0]来获得。 实际上sys.path是Python会去寻找模块的搜索路径列表,sys.path[0]和sys.argv[0]是一回事因为Python会自动把sys.argv[0]加入sys.path。 具体来说,如果你在C:\test目录下执行python getpath\getpath.py,那么os.getcwd()会输出C:\test,sys.path[0]会输出C:\test\getpath。 更特别地,如果你用py2exe模块把Python脚本编译为可执行文件,那么sys.path[0]的输出还会变化: 如果把依赖库用默认的方式打包为zip文件,那么sys.path[0]会输出C:\test 如果我们在 sub_path.py里面使用sys.path[0],那么其实得到的是getpath.py所在的目录路径C:\test,因为Python虚拟机是从getpath.py开始执行的。
python导入同级别模块很方便: import xxx 要导入下级目录页挺方便,需要在下级目录中写一个__init__.py文件 from dirname import xxx 要导入上级目录,可以使用 sys.path 首先 sys.path 的作用是:当使用import语句导入模块时,解释器会搜索当前模块所在目录以及sys.path指定的路径去找需要import的模块 所以改变思路,直接把上级目录加到 sys.path
import sysprint(sys.path) from pack1.test_11 import add x = 1y = 2z = add(x, y)print(z) 代码运行结果 ? 提示无法找到pack1 我们在导入模块时,本质上是Python解释器在sys.path的地址中寻找对应的文件,我们在运行某个程序时,会默认将当前文件所在路径加入到sys.path中,其余的地址是默认的 sys.path中。 import sys from pack1.test_11 import add print(sys.path)x = 1y = 2z = add(x, y)print(z) 运行结果 ? 按照上文的解释,代码所在文件夹会纳入sys.path中,而pack1属于该文件夹的子文件夹下,会搜索到,所以无需修改sys.path
执行import sys; print(sys.path)查看python搜索路径,确保自己的模块在python搜索路径中 python的搜索路径与包(package) python的搜索路径其实是一个列表 ,它是指导入模块时,python会自动去找搜索这个列表当中的路径,如果路径中存在要导入的模块文件则导入成功,否则导入失败: >>> import sys >>> sys.path ['', 'C:\\Python33 lib\\site-packages', 'E:\\python'] >>> 当安装第三方模块的时候,如果不是按照标准方式安装,则为了能够引用(import)这些模块,必须将这些模块的安装路径添加到sys.path 中,有以下几种方法: 最简单的方法:是在sys.path的某个目录下添加路径配置文件,最常见的就是在…/site-package/目录下。 路径配置文件的扩展名是”.pth”,其中的每一行包含一个单独的路径,该路径会添加到sys.path列表中(已验证)。”.
3.导入上级模块 要导入上级目录下模块,可以使用sys.path: import sys sys.path.append("..") import file1 sys.path的作用:当使用import语句导入模块时,解释器会搜索当前模块所在目录以及sys.path指定的路径去找需要import的模块,所以这里是直接把上级目录加到了sys.path 这其实是前面两个操作的组合,其思路本质上是将上级目录加到sys.path里,再按照对下级目录模块的方式导入。 同样需要被引文件夹也就是dir3下有空的__init__.py文件。 | file1.py | file2.py | dir3 | __init__.py | file3.py | dir4 | file4.py 同时也要将上级目录加到sys.path
如果没有找到,接着搜索sys.path列出的目录下面是不是有名为mylib的模块。 sys.path的初始化按以下几个路径的顺序: (1)包含输入脚本的目录,如果没有输入脚本则是当前目录; (2)环境变量PYTHONPATH(一个目录名称的列表); (3)Python库的安装目录 接下来我们通过交互式Python解释器来看看sys.path,运行CPython解释器再导入sys: >>> import sys >>> sys.path ['', '/home/veelion/.virtualenvs 以上两种方法验证的sys.path都符合预期,然而IPython有点例外。 注意你可以在程序中修改sys.path。sys.path是一个Python的列表结构,我们可以像修改列表那样修改它,增加、删除、修改路径顺序。
#本文给大家讲解的是使用python获取当前所在目录的方法以及相关示例,非常的清晰简单,有需要的小伙伴可以参考下 sys.path 模块搜索路径的字符串列表。 sys.path[0]是调用Python解释器的当前脚本所在的目录。 sys.argv 一个传给Python脚本的指令参数列表。 /usr/bin/env python import os import sys if __name__ == '__main__': print "sys.path[0] =", sys.path os.path.realpath(__file__)) print "os.getcwd() =", os.getcwd() 在 /d 中运行,输出为 $ python /e/pyws/path_demo.py sys.path /pyws/path_demo.py sys.path[0] = E:\pyws sys.argv[0] = ./pyws/path_demo.py __file__ = .
print 'The command line arguments are:' for i in sys.argv: print i print '\n\nThe PYTHONPATH is', sys.path 当Python执行import sys语句的时候,它在sys.path变量中所列目录中寻找sys.py模块。如果找到了这个文件,这个模块的主块中的语句将被运行,然后这个模块将能够被你使用。 sys.path包含输入模块的目录名列表。我们可以观察到sys.path的第一个字符串是空的——这个空的字符串表示当前目录也是sys.path的一部分,这与PYTHONPATH环境变量是相同的。 否则,你得把你的模块放在sys.path所列的目录之一。 下面我们保存这段代码为module_sys.py,从终端使用python来运行,并输入参数“test argument”,如下图所示: ? 这个模块应该被放置在我们导入它的程序的同一个目录中,或者在sys.path所列目录之一。 测试代码如下: #!
看看效果: $ pdm run python -S -c "import sys;print(sys.path)" [ '', '/Users/fming/wkspace/github/ sys.path里面有本地的包目录,但没有site-packages了。问题解决了吗?没有!先喘口气,看看这个sys.path,不知有没人发现问题在哪。 这个文件会在 Python 启动时执行,那就可以在这里操作sys.path去掉 site-packages 的路径了。 具体改动可以看这个 PR,改完之后再看看效果: $ pdm run python -c "import sys;print(sys.path)" [ '', '/Users/fming/ Footnotes .pth 文件中包含的路径可以被加载到sys.path中,参考官方文档 ↩
sys.path返回路径列表,代表Python导包时搜索的路径。 2、Python解释器依次从sys.path中找到要导入的模块文件或包。 ''表示当前的路径。 在sys.path列表中,路径的顺序代表了Python解释器在搜索模块时的顺序。 实例 In [1]: import sys In [2]: sys.path Out[2]: ['D:\\Hui\\DevelopEnv\\Python\\Python379\\Scripts\\ipython.exe
Users\User> python project/main.py正确方式:C:\Users\User> cd projectC:\Users\User\project> python main.py2. sys.path 未包含当前目录Python在导入模块时会搜索sys.path中的路径,如果当前目录不在其中,会导致导入失败。 验证方式:import sysprint(sys.path) # 检查当前目录是否在输出列表中3. 相对导入与绝对导入混淆在包内部使用相对导入时,需要确保文件是作为模块运行的,而不是作为主脚本运行。 相对导入示例:# 在同一目录下from . import module_name # 相对导入解决方案方法1:修改sys.path添加当前目录在脚本开头动态添加当前目录到Python路径:import A: PyCharm会自动将项目根目录添加到sys.path,而命令行不会。解决方法是在命令行中进入项目根目录运行,或使用-m参数。Q: 相对导入和绝对导入哪个更好?
这里解决办法是在文件最上面,也就是import模块之前,加上类似如下代码:if __name__ == '__main__': import sys import os sys.path.append(sys.path Better Method其实这样做的目的无非是将当前模块的path添加到sys.path中,所以还有下面这个通用方法: 比如我们的项目结构是:app /module1 a.py .a这个模块,所以我们需要下面这样改写import sysimport osif __name__ == '__main__': sys.path.append(os.path.dirname(sys.path [0]))这样改写的原因是我们知道当前路径的上一层就能找到module1.a这个模块,所以把上一层的路径加到sys.path当中去。
y | |--a | |--__init__.py // 表明y是package | | |--b_test.py | | |--__init__.py // 表明a是package sys.path 如果用python -m pytest,以模块的方式来执行,会把cwd也加入sys.path中。 例如,在a目录下执行pytest,cwd是a,basedir是y,sys.path中只包含y。 如果执行python -m pytest,sys.path中既包含y也包含a y |--a | |--b_test.py | |--__init__.py // 表明a是package pytest 调用sys.path.insert(0, basedir) ,把basedir加入sys.path中。这些模块就可以被pytest import了。
Python 就是在 sys.path 中查找包和模块的。 import sysprint(sys.path)print('Now in main.py')def hello(): print('michael hello')if __name__ == 然后就是搜索 sys.path 路径下的模块了。 redis 属于第三方模块,默认安装位置是 Python 环境变量中的 site-packages,解释器启动之后,会将此目录加到 sys.path,由于当前目录会在 sys.path 的首位,当前目录的 8.总结Python 通过查找 sys.path 来决定包的导入,Python解释器启动时加载的模块缓存 > 同级目录 > sys.path1:。
本文链接 Python2.7 中获取路径的各种方法 sys.path 模块搜索路径的字符串列表。由环境变量PYTHONPATH初始化得到。 sys.path[0]是调用Python解释器的当前脚本所在的目录。 sys.argv 一个传给Python脚本的指令参数列表。 /usr/bin/env python import os import sys if __name__ == '__main__': print "sys.path[0] =", sys.path os.path.realpath(__file__)) print "os.getcwd() =", os.getcwd() 在/d中运行,输出为 $ python /e/pyws/path_demo.py sys.path /pyws/path_demo.py sys.path[0] = E:\pyws sys.argv[0] = ./pyws/path_demo.py __file__ = .
编写 script.py 脚本,内容如下: import sys print(sys.path) print(sys.modules) 直接执行脚本 $ python script.py ['/home 通过比较不同的地方,我们发现: 第一种方法——直接运行脚本,当前脚本所在的路径会加入到 sys.path 列表中,但是 sys.modules 字典中的 __main__ 的路径不是绝对路径,只是脚本名称 第二种方法——当做模块方式运行,当前脚本所在的路径不会加入到 sys.path 列表中,但是 sys.modules 字典中的 __main__ 的路径是绝对路径,同时,还引入了 runpy 和 pkgutil sys.path -> sys.modules -> < module >.__dict__。 sys.path:是一个列表。保存着模块的搜索路径。 如果没有,则从 sys.path 查找,找到后载入内存,并加入到 sys.modules 字典,名称也将导入到当前模块的 Local 命名空间。