让我们假设以下目录树:
/
home/
user/
X/
scripy.py
Y/
a.c
b.c
我有一个python脚本,有很多命令使用相对路径,这样做:
def f1(relative_path_to_a, relative_path_to_c):
abs_path = PATH_TO_PLACE_FROM_SCRIPT_WAS_CALLED
c_abs_path = abs_path + relative_path_to_c
file_a = open(relative_path_to_a)
file_a.write(c_abs_path)
close()
正如它发现的那样,我需要在另一台具有不同目录树的机器上使用它。还应该有可能从其他位置调用脚本,而不是放置脚本。
将所有路径更改为绝对路径需要一些时间,但并非不可能。另一方面,我提出了将脚本开头的路径更改为/home/user/X
的想法(我通过向X
目录添加一个python文件并在其内部调用来实现它{ {1}},然后在script.py中abs_path = os.path.abspath(".")
。
第二种解决方案的缺点是什么?有什么情况可以崩溃吗?
准确地说,在第二个解决方案中,我正在做这个:
os.chdir(second_script.abs_path)
答案 0 :(得分:0)
要使程序可重用,它们应相对于当前工作目录工作,而不是更改cwd 而不是相对于程序的位置。所以你应该使用类似的东西:
# relative_path_to_a = 'Y/a.c'
# relative_path_to_c = 'Y/b.c'
def f1(relative_path_to_a, relative_path_to_c):
c_abs_path = os.path.abspath(relative_path_to_c)
a_abs_path = os.path.abspath(relative_path_to_a)
with open(a_abs_path) as file_a:
file_a.write(c_abs_path)
这意味着您运行的用户X
(cd /user/X && python script.py) # modifies /user/X/Y/a.c
并且对于用户Z
,您可以使用
(cd /user/Z && python ../X/script.py) # modifies /user/Z/Y/a.c