关于在python中设置shell PATH环境变量
本帖最后由 alinunix 于 2013-09-24 10:27 编辑想把一个c shell脚本转换成python脚本,关于在python中设置shell PATH环境变量,我是按下面的方法设的,感觉写得非常麻烦,特别是c shell脚本比较长的时候,转换起来觉得很费劲,请教高手有没有更好的实现方法?
c shell:
setenv TOOLDIR "/dirname/a/b/c/tools"
set path = ( $TOOLDIR/a/bin $TOOLDIR/b/bin $TOOLDIR/c/bin $TOOLDIR/d/bin $TOOLDIR/e/bin $TOOLDIR/f/bin $path)
=>
Python script:
import os
os.environ['TOOLDIR'] = '/dirname/a/b/c/tools'
TOOLDIR = os.getenv('TOOLDIR')
os.environ['PATH'] = TOOLDIR + '/a/bin' + :' \
+ TOOLDIR + '/b/bin' + :' \
+ TOOLDIR + '/c/bin' + :' \
+ TOOLDIR + '/d/bin' + :' \
+ TOOLDIR + '/e/bin' + :' \
+ TOOLDIR + '/f/bin' + :' \
+ os.environ['PATH']
Python没有Perl的变量插值,连接字符串好像只能用“+”,这个path写成上面这样实在觉得有些别扭,不知道有没有更简洁的实现方法? 就是格式化字符串吧
2.5版本以前的一种方法:
>>> TOOLBAR = '/data'
>>> PATH = '%(TOOLBAR)s/a/b/c %(TOOLBAR)s/x/y/z' % {'TOOLBAR': TOOLBAR}
>>> print PATH
/data/a/b/c /data/x/y/z2.5版本以后的一种方法:>>> '{0}/a/b/c {0}/x/y/z'.format(TOOLBAR)
'/data/a/b/c /data/x/y/z'
>>> '{TOOLBAR}/a/b/c {TOOLBAR}/x/y/z'.format(TOOLBAR=TOOLBAR)
'/data/a/b/c /data/x/y/z' timespace 发表于 2013-09-24 11:07 static/image/common/back.gif
就是格式化字符串吧
2.5版本以前的一种方法:2.5版本以后的一种方法:
timespace兄,这个果然好多了,非常感谢! 回复 2# timespace
timespace兄,这个能否也麻烦你帮我看下?多谢啦!
http://bbs.chinaunix.net/thread-4099778-1-1.html
本帖最后由 alinunix 于 2013-09-27 15:38 编辑
2.4以后还有下面这个用法,对于用惯了$符号的人,可能是看了最顺眼的了。
#!/usr/bin/env python
import string
TOOLBAR = '/data'
PATH = string.Template('$TOOLBAR/a/b/c $TOOLBAR/x/y/z').substitute(vars())
print PATH
输出:/data/a/b/c /data/x/y/z
这个是最接近Perl的变量插值了,不过还是麻烦啊,直接写成(“$TOOLBAR/a/b/c $TOOLBAR/x/y/z”)多简单啊。
Python Cookbook(3rd) 里提到:
Discussion
The lack of true variable interpolation in Python has led to a variety of solutions over
the years.
可见变量插值用得很多的,很多人都会碰到这个问题,Python里单引号、双引号功能是一样的,为什么不把双引号用来做变量插值呢,这样不是方便多了吗?Python将来能实现这样的用法就好了:)
#! /usr/bin/env python
# coding:utf-8
import ctypes, os
print os.getenv('LD_LIBRARY_PATH')
os.environ['LD_LIBRARY_PATH'] = \
':'.join(("/root/code/java/bigdata/postdeal/Debug/",
"/root/code/java/bigdata/logdel/Debug",
"/root/code/java/bigdata/Readfile",
os.getenv('LD_LIBRARY_PATH'),))
print os.getenv('LD_LIBRARY_PATH')
ll = ctypes.cdll.LoadLibrary
lib = ll("libpycall.so")
print lib.foo(1, 3)
print '***finish***'
页:
[1]