http://blog.csdn.net/shanliangliuxing/article/details/8823461
- 如何将路径“永久"添加到sys.path?
sys.path是Python的搜索模块的路径集,是一个list
可以在python 环境下使用sys.path.append(path)添加相关的路径,但在退出python环境后自己添加的路径就会自动消失了!
可以使用以下命令输入当前python 的搜索路径:
python -c "import sys;print '当前的python是:' + sys.prefix; print '\n'.join(sys.path)"
练习使用sys.path.append方法添加路径,显示退出python会消失!
python -c"import sys;print '当前的python是:'+sys.prefix;sys.path.append(r'E:\DjangoWord' ) ;print '\n'.join(sys.path)"
python -c"import sys;print '当前的python是:'+sys.prefix;print '\n'.join(sys.path)"
再次运行,会发现 自己添加路径E:\DjangoWord()不存在了!
解决方案
只需简单地在Python的sys.path中加入一个"目录",不过要小心重复的情况:
- def AddSysPath(new_path):
- """ AddSysPath(new_path):给Python的sys.path增加一个"目录"
- 如果此目录不存在或者已经在sys.path中了,则不操作
- 返回1表示成功,-1表示new_path不存在,0表示已经在sys.path中了
- already on sys.path.
- """
- import sys, os
- # 避免加入一个不存在的目录
- if not os.path.exists(new_path): return -1
- # 将路径标准化。 Windows是大小写不敏感的,所以若确定在
- # Windows下,将其转成小写
- new_path = os.path.abspath(new_path)
- if sys.platform == 'win32':
- new_pathnew_path = new_path.lower( )
- # 检查当前所有的路径
- for x in sys.path:
- x = os.path.abspath(x)
- if sys.platform == 'win32':
- xx = x.lower( )
- if new_path in (x, x + os.sep):
- return 0
- sys.path.append(new_path)
- # 如果想让new_path在sys.path处于最前
- # 使用:sys.path.insert(0, new_path)
- return 1
- if _ _name_ _ == '_ _main_ _':
- # 测试,显示用法
- import sys
- print 'Before:'
- for x in sys.path: print x
- if sys.platform == 'win32':
- print AddSysPath('c:\\Temp')
- print AddSysPath('c:\\temp')
- else:
- print AddSysPath('/usr/lib/my_modules')
- print 'After:'
- for x in sys.path: print x
讨论
模块要处于Python搜索路径中的目录里才能被导入,但我们不喜欢维护一个永久性的大目录,因为其他所有的Python脚本和应用程序导入模块的时候性能都会被拖累。本节代码动态地在该路径中添加了一个"目录",当然前提是此目录存在而且此前不在sys.path中。
sys.path是个列表,所以在末尾添加目录是很容易的,用sys.path.append就行了。当这个append执行完之后,新目录即时起效,以后的每次import操作都可能会检查这个目录。
如同解决方案所示,可以选择用sys.path.insert(0,…,这样新添加的目录会优先于其他目录被import检查。
即使sys.path中存在重复,或者一个不存在的目录被不小心添加进来,也没什么大不了,Python的import语句非常聪明,它会自己应付这类问题。但是,如果每次import时都发生这种错误(比如,重复的不成功搜索,操作系统提示的需要进一步处理的错误),我们会被迫付出一点小小的性能代价。为了避免这种无谓的开销,本节代码在向sys.path添加内容时非常谨慎,绝不加入不存在的目录或者重复的目录。程序向sys.path添加的目录只会在此程序的生命周期之内有效,其他所有的对sys.path的动态操作也是如此。
import sys, os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
1).当"print os.path.dirname(__file__)"所在脚本是以完整路径被运行的, 那么将输出该脚本所在的完整路径,比如:
Python d:/pythonSrc/test/test.py
那么将输出 d:/pythonSrc/test
(2).当"print os.path.dirname(__file__)"所在脚本是以相对路径被运行的, 那么将输出空目录,比如:
python test.py
那么将输出空字符串
================
os.path模块主要用于文件的属性获取,在编程中经常用到,以下是该模块的几种常用方法。
更多的方法可以去查看官方文档:http://docs.python.org/library/os.path.html
- 1.os.path.abspath(path)
- 返回path规范化的绝对路径。
- >>> os.path.abspath('test.csv')
- 'C:\\Python25\\test.csv'
- >>> os.path.abspath('c:\\test.csv')
- 'c:\\test.csv'
- >>> os.path.abspath('../csv\\test.csv')
- 'C:\\csv\\test.csv'
- 2.os.path.split(path)
- 将path分割成目录和文件名二元组返回。
- >>> os.path.split('c:\\csv\\test.csv')
- ('c:\\csv', 'test.csv')
- >>> os.path.split('c:\\csv\\')
- ('c:\\csv', '')
- 3.os.path.dirname(path)
- 返回path的目录。其实就是os.path.split(path)的第一个元素。
- >>> os.path.dirname('c:\\csv\test.csv')
- 'c:\\'
- >>> os.path.dirname('c:\\csv')
- 'c:\\'
- 4.os.path.basename(path)
- 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素。
- >>> os.path.basename('c:\\test.csv')
- 'test.csv'
- >>> os.path.basename('c:\\csv')
- 'csv' (这里csv被当作文件名处理了)
- >>> os.path.basename('c:\\csv\\')
- ''
- 5.os.path.commonprefix(list)
- 返回list中,所有path共有的最长的路径。
- 如:
- >>> os.path.commonprefix(['/home/td','/home/td/ff','/home/td/fff'])
- '/home/td'
- 6.os.path.exists(path)
- 如果path存在,返回True;如果path不存在,返回False。
- >>> os.path.exists('c:\\')
- True
- >>> os.path.exists('c:\\csv\\test.csv')
- False
- 7.os.path.isabs(path)
- 如果path是绝对路径,返回True。
- 8.os.path.isfile(path)
- 如果path是一个存在的文件,返回True。否则返回False。
- >>> os.path.isfile('c:\\boot.ini')
- True
- >>> os.path.isfile('c:\\csv\\test.csv')
- False
- >>> os.path.isfile('c:\\csv\\')
- False
- 9.os.path.isdir(path)
- 如果path是一个存在的目录,则返回True。否则返回False。
- >>> os.path.isdir('c:\\')
- True
- >>> os.path.isdir('c:\\csv\\')
- False
- >>> os.path.isdir('c:\\windows\\test.csv')
- False
- 10.os.path.join(path1[, path2[, ...]])
- 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。
- >>> os.path.join('c:\\', 'csv', 'test.csv')
- 'c:\\csv\\test.csv'
- >>> os.path.join('windows\temp', 'c:\\', 'csv', 'test.csv')
- 'c:\\csv\\test.csv'
- >>> os.path.join('/home/aa','/home/aa/bb','/home/aa/bb/c')
- '/home/aa/bb/c'
- 11.os.path.normcase(path)
- 在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。
- >>> os.path.normcase('c:/windows\\system32\\')
- 'c:\\windows\\system32\\'
- 12.os.path.normpath(path)
- 规范化路径。
- >>> os.path.normpath('c://windows\\System32\\../Temp/')
- 'c:\\windows\\Temp'
- 12.os.path.splitdrive(path)
- 返回(drivername,fpath)元组
- >>> os.path.splitdrive('c:\\windows')
- ('c:', '\\windows')
- 13.os.path.splitext(path)
- 分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作
- >>> os.path.splitext('c:\\csv\\test.csv')
- ('c:\\csv\\test', '.csv')
- 14.os.path.getsize(path)
- 返回path的文件的大小(字节)。
- >>> os.path.getsize('c:\\boot.ini')
- 299L
- 15.os.path.getatime(path)
- 返回path所指向的文件或者目录的最后存取时间。
- 16.os.path.getmtime(path)
- 返回path所指向的文件或者目录的最后修改时间