导入当前运行脚本文件所在路径, 还有没有更好的办法?

2013-01-29 14:01:39 +08:00
 sdjl
比如 我要运行 python /opt/a/b/c.py 然后需要在c运行时import b里面的其它module

那么我会在c中加入如下代码:

import sys, os
if __name__=='__main__':
____father_dir = os.path.split(os.path.realpath(__file__))[0].rpartition('/')[0]
____if father_dir not in sys.path:
________sys.path.insert(0, father_dir)

其中____表示站位

这样便可以import b里面的东西了, 但是许多文件都需要这个功能, 有什么比较优雅的方法吗?
3039 次点击
所在节点    Python
12 条回复
jsz
2013-01-29 14:34:28 +08:00
运行伊始就chdir到模块所在的路径~
ThunderEX
2013-01-29 14:46:46 +08:00
lerry
2013-01-29 14:53:09 +08:00
ratazzi
2013-01-29 14:53:48 +08:00
PYTHONPATH=/opt/a/b python /opt/a/b/c.py
sdjl
2013-01-29 15:05:22 +08:00
@ThunderEX
@lerry

这不行吧, 因为__file__在不同的模块中值不一样, 只能传参, 但是传参要先import函数
sdjl
2013-01-29 15:06:20 +08:00
@jsz 目的就是不cd

@ratazzi 这个办法就达不到目的了
ratazzi
2013-01-29 15:20:51 +08:00
@sdjl 那你就直接写成包吧,用 setuptools
lerry
2013-01-29 16:55:08 +08:00
@sdjl 我给你发的链接里面是这样的,
while循环得到上级目录,一直到找到特定的文件或者目录名,链接里面是“.app ”和“misc”,这个文件名要是特别的,以确定到达了指定的目录, 这时,把这个路径加入到sys.path,这样import就没问题了
jsz
2013-01-29 17:12:49 +08:00
意思是说很多模块需要重复这一步?那写成函数就行,如果__file__不行的话把它当成参数传进函数即可。

另外,用dirname会更简单点,os.path.dirname(os.path.abspath(__file__))
clowwindy
2013-01-29 17:19:16 +08:00
虽然不是楼主想要的答案,不过

1. 用绝对包名,不用相对包名,Python 已经不推荐使用相对包名
2. 主模块即可执行的模块要放在最顶层,或者遵循 setuptools 的规范。因为用 python xxx.py 执行运行脚本的时候,python 默认会把 PYTHONPATH 设为 xxx.py 所在的目录

可以看看 PEP8
sdjl
2013-01-29 21:04:08 +08:00
@jsz 传参的话, 需要传给一个函数f, 但是这个函数要先import嘛

os.path.dirname(os.path.abspath(__file__)) 方法确实更好看, 如果运行的路径是“软连接”的话, 此方法会得到软连接的地址, 上面那个是文件的真实地址

不过此方法确实是我需要的



@clowwindy 谢谢
hfeeki
2013-01-29 23:02:34 +08:00
在b目录里面增加一个--init--.py 文件,设置里面的 --all--=['moduleA', 'mB', 'mC'],
代码里面 from b import *
上面的 - 要替换成下划线,v2ex好像不允许输入下划线

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/59158

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX