动态地改变Python搜索路径

sys.path.insert(0, os.path.normpath(os.path.join(os.path.normpath(os.path.join(os.getcwd(),os.path.dirname(__file__))), './..')))

os.getcwd()

 

  1 #!/usr/local/services/python/bin/python
  2 # -*- coding: utf-8 -*-
  3
  4 import sys
  5 import os
  6 #sys.path.insert(0, os.path.normpath(os.path.join(os.path.normpath(os.path.join(os.getcwd(),os.path.dirname(__file__))), '
  7 #import os
  8
  9 #获取当前脚本文件路径
 10 print os.path.dirname(os.path.abspath(__file__))
 11
 12 #获取当前路径的上级目录
 13 print os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
 14 print os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
 15 print (os.getcwd())
 16 print(sys.path[0])

 17 print (os.path.normpath(os.path.join(os.getcwd(),'..')))

 

ISD_223_121_sles10:/data/XXXX/vpc_monitor_worker # ./include.py
/data/XXXX/vpc_monitor_worker
/data/XXXX/vpc_monitor_worker
/data/XXXX
/data/XXXX/vpc_monitor_worker
/data/XXXX/vpc_monitor_worker

/data/XXXX

1、os.getcwd():获取当前工作目录,也就是在哪个目录下运行这个程序。举例来说:假设F:\aaa\bbb\ccc目录下有个文件 TestDir.py,打印当前工作目录。进入windows命令行窗口:

  在F:\aaa\bbb\ccc运行 python TestDir.py,输出F:\aaa\bbb\ccc

  在F:\aaa\bbb运行 python ccc/TestDir.py,输出F:\aaa\bbb

  在F:\aaa运行 python bbb/ccc/TestDir.py,输出F:\aaa

2、如果我想获取TestDir.py文件所在的目录,怎么办?

使用sys.path[0] 

1 import os
2 print(os.getcwd())
3 
4 import sys
5 print(sys.path[0],end='')

 

http://zhidao.baidu.com/question/552000838.html

module2.py

importsys
importos
printsys.path
workpath= os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.insert(0, os.path.join(workpath,'modules'))
printsys.path
$ python module2.py
['e:\\Project\\Python','C:\\WINDOWS\\system32\\python25.zip', ...]
['e:\\Project\\Python\\modules','e:\\Project\\Python','C:\\WINDOWS\\system32\\python25.zip', ...]

其他的要点

模块能像包含函数定义一样,可包含一些可执行语句。这些可执行语句通常用来进行模块的初始化工作。这些语句只在模块第一次被导入时被执行。这非常重要,有些人以为这些语句会多次导入多次执行,其实不然。

模块在被导入执行时,python解释器为加快程序的启动速度,会在与模块文件同一目录下生成.pyc文件。我们知道python是解释性的脚本语言,而.pyc是经过编译后的字节码,这一工作会自动完成,而无需程序员手动执行。

 

 

 

通过修改python的模块(module)搜索路径PYTHONPATH,使import可以方便的引入不同位置的module。

1. 查看当前的module搜索路径
    sys.path
2. 添加新的路径'~/my'到Python的环境变量PYTHONPATH
    export PYTHONPATH=$PYTHONPATH:~/my/
3. 将新的路径保存到.bashrc中,使每次打开Terminal都能自动添加好新的路径
    用文本编辑器打开~目录下的.bashrc文件,然后搜索PYTHONPATH的定义,如果没有就在文件最后添加:

PYTHONPATH="${PYTHONPATH}:~/my/"
export PYTHONPATH

如果有PYTHONPATH的定义,就直接在定义后面添加“~/my/”


在学习使用py2exe将python程序编译windows下的可执行程序的时候,需要修改python shell的当前工作路径.但是python shell中可不能使用cd的呀???

      实例如下:
     import   os
     os.chrdir('目标目录')
     还可以使用os.getcwd()得到当前目录

 

import os

#获取当前脚本文件路径
print os.path.dirname(os.path.abspath(__file__))

#获取当前路径的上级目录
print os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
print os.path.abspath(os.path.join(os.path.dirname(__file__),".."))

ISD_223_121_sles10:/data/XXXX/vpc_monitor_worker # ./include.py
/data/XXXX/vpc_monitor_worker
/data/XXXX/vpc_monitor_worker
/data/XXXX

 

Python os.path.dirname(__file__)
Python os.path.join(str,str)

(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.dirname(__file__)

获取路径名:os.path.dirname()

获取文件所在目录的完整路径:os.path.dirname(__file__)

在django项目中的settings.py中还可以进行如下的配置:

如配置数据库:

1 import os
2 DATABASE_ENGINE='sqlite3'
3 DATABASE_NAME=os.path.join(os.path.dirname(__file__),'myAPP/mydata.db')

其中 os.path.dirname(__file__)函数用于取出settings.py所在文件夹的位置,在用os.path.join()函数将该位置和后面指定的'myAPP/mydata.db'  字符串连接一起,实现sqlite3数据库文件mydata.db具体存放的位置。

 

  1. 1.os.path.abspath(path) 
  2. 返回path规范化的绝对路径。 
  3.  
  4. >>> os.path.abspath('test.csv'
  5. 'C:\\Python25\\test.csv' 
  6.  
  7. >>> os.path.abspath('c:\\test.csv'
  8. 'c:\\test.csv' 
  9.  
  10. >>> os.path.abspath('../csv\\test.csv'
  11. 'C:\\csv\\test.csv' 
  12.  
  13. 2.os.path.split(path) 
  14. 将path分割成目录和文件名二元组返回。 
  15.  
  16. >>> os.path.split('c:\\csv\\test.csv'
  17. ('c:\\csv''test.csv'
  18. >>> os.path.split('c:\\csv\\'
  19. ('c:\\csv'''
  20.  
  21. 3.os.path.dirname(path) 
  22. 返回path的目录。其实就是os.path.split(path)的第一个元素。 
  23.  
  24. >>> os.path.dirname('c:\\csv\test.csv'
  25. 'c:\\' 
  26. >>> os.path.dirname('c:\\csv'
  27. 'c:\\' 
  28.  
  29. 4.os.path.basename(path) 
  30. 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素。 
  31.  
  32. >>> os.path.basename('c:\\test.csv'
  33. 'test.csv' 
  34. >>> os.path.basename('c:\\csv'
  35. 'csv' (这里csv被当作文件名处理了) 
  36. >>> os.path.basename('c:\\csv\\'
  37. '' 
  38.  
  39. 5.os.path.commonprefix(list) 
  40. 返回list中,所有path共有的最长的路径。 
  41.  
  42. 如: 
  43. >>> os.path.commonprefix(['/home/td','/home/td/ff','/home/td/fff']) 
  44. '/home/td' 
  45.  
  46. 6.os.path.exists(path) 
  47. 如果path存在,返回True;如果path不存在,返回False。 
  48.  
  49. >>> os.path.exists('c:\\'
  50. True 
  51. >>> os.path.exists('c:\\csv\\test.csv'
  52. False 
  53.  
  54. 7.os.path.isabs(path) 
  55. 如果path是绝对路径,返回True。 
  56.  
  57. 8.os.path.isfile(path) 
  58. 如果path是一个存在的文件,返回True。否则返回False。 
  59.  
  60. >>> os.path.isfile('c:\\boot.ini'
  61. True 
  62. >>> os.path.isfile('c:\\csv\\test.csv'
  63. False 
  64. >>> os.path.isfile('c:\\csv\\'
  65. False 
  66.  
  67. 9.os.path.isdir(path) 
  68. 如果path是一个存在的目录,则返回True。否则返回False。 
  69.  
  70. >>> os.path.isdir('c:\\'
  71. True 
  72. >>> os.path.isdir('c:\\csv\\'
  73. False 
  74. >>> os.path.isdir('c:\\windows\\test.csv'
  75. False 
  76.  
  77. 10.os.path.join(path1[, path2[, ...]]) 
  78. 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。 
  79.  
  80. >>> os.path.join('c:\\', 'csv', 'test.csv') 
  81. 'c:\\csv\\test.csv' 
  82. >>> os.path.join('windows\temp''c:\\', 'csv', 'test.csv') 
  83. 'c:\\csv\\test.csv' 
  84. >>> os.path.join('/home/aa','/home/aa/bb','/home/aa/bb/c'
  85. '/home/aa/bb/c' 
  86.  
  87. 11.os.path.normcase(path) 
  88. 在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。 
  89.  
  90. >>> os.path.normcase('c:/windows\\system32\\'
  91. 'c:\\windows\\system32\\' 
  92.  
  93. 12.os.path.normpath(path) 
  94. 规范化路径。 
  95.  
  96. >>> os.path.normpath('c://windows\\System32\\../Temp/'
  97. 'c:\\windows\\Temp' 
  98.  
  99. 12.os.path.splitdrive(path) 
  100. 返回(drivername,fpath)元组 
  101.  
  102. >>> os.path.splitdrive('c:\\windows'
  103. ('c:''\\windows'
  104.  
  105. 13.os.path.splitext(path) 
  106. 分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作 
  107.  
  108. >>> os.path.splitext('c:\\csv\\test.csv'
  109. ('c:\\csv\\test''.csv'
  110.  
  111. 14.os.path.getsize(path) 
  112. 返回path的文件的大小(字节)。 
  113.  
  114. >>> os.path.getsize('c:\\boot.ini'
  115. 299L 
  116.  
  117. 15.os.path.getatime(path) 
  118. 返回path所指向的文件或者目录的最后存取时间。 
  119.  
  120. 16.os.path.getmtime(path) 
  121. 返回path所指向的文件或者目录的最后修改时间 

 

 

动态地改变Python搜索路径

感谢:Robin Parmar

任务

模块必须处于Python搜索路径中才能被导入,但你不想设置个永久性的大路径,因为那样可能会影响性能,所以,你希望能够动态地改变这个路径。

解决方案

只需简单地在Python的sys.path中加入一个"目录",不过要小心重复的情况:

 
 
  1. def AddSysPath(new_path):
  2. """ AddSysPath(new_path):给Python的sys.path增加一个"目录"
  3. 如果此目录不存在或者已经在sys.path中了,则不操作
  4. 返回1表示成功,-1表示new_path不存在,0表示已经在sys.path中了
  5. already on sys.path.
  6. """
  7. import sys, os
  8. # 避免加入一个不存在的目录
  9. if not os.path.exists(new_path): return -1
  10. # 将路径标准化。 Windows是大小写不敏感的,所以若确定在
  11. # Windows下,将其转成小写
  12. new_path = os.path.abspath(new_path)
  13. if sys.platform == 'win32':
  14. new_pathnew_path = new_path.lower( )
  15. # 检查当前所有的路径
  16. for x in sys.path:
  17. x = os.path.abspath(x)
  18. if sys.platform == 'win32':
  19. xx = x.lower( )
  20. if new_path in (x, x + os.sep):
  21. return 0
  22. sys.path.append(new_path)
  23. # 如果想让new_path在sys.path处于最前
  24. # 使用:sys.path.insert(0, new_path)
  25. return 1
  26. if _ _name_ _ == '_ _main_ _':
  27. # 测试,显示用法
  28. import sys
  29. print 'Before:'
  30. for x in sys.path: print x
  31. if sys.platform == 'win32':
  32. print AddSysPath('c:\\Temp')
  33. print AddSysPath('c:\\temp')
  34. else:
  35. print AddSysPath('/usr/lib/my_modules')
  36. print 'After:'
  37. 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的动态操作也是如此。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值