从Windows批处理执行Python脚本时相对路径是否中断?

时间:2013-08-29 22:59:48

标签: python windows batch-file relative-path

如果我直接从它所在的目录中执行它,我的Python脚本运行得很好。但是如果我退出该目录并尝试从其他地方执行它(不更改任何代码或文件位置),则所有相对路径休息,我得到一个FileNotFoundError

该脚本位于./scripts/bin/my_script.py。有一个名为./scripts/bin/data/的目录。就像我说的那样,只要我从同一个目录执行它就完全可以工作......所以我很困惑。

成功执行 in ./scripts/bin/):python my_script.py

执行失败 in ./scripts/):python bin/my_script.pypython ./bin/my_script.py

失败消息:

Traceback (most recent call last):
  File "./bin/my_script.py", line 87, in <module>
    run()
  File "./bin/my_script.py", line 61, in run
    load_data()
  File "C:\Users\XXXX\Desktop\scripts\bin\tables.py", line 12, in load_data
DATA = read_file("data/my_data.txt")
  File "C:\Users\XXXX\Desktop\scripts\bin\fileutil.py", line 5, in read_file
    with open(filename, "r") as file:
FileNotFoundError: [Errno 2] No such file or directory: 'data/my_data.txt'

相关Python代码

def read_file(filename):
    with open(filename, "r") as file:
        lines = [line.strip() for line in file]
        return [line for line in lines if len(line) == 0 or line[0] != "#"]

def load_data():
    global DATA
    DATA = read_file("data/my_data.txt")

2 个答案:

答案 0 :(得分:6)

是的,这是合乎逻辑的。这些文件是相对于您的工作目录的。您可以通过从其他目录运行脚本来更改它。 你可以做的是在运行时获取你正在运行的脚本的目录并从中构建。

import os

def read_file(filename):
    #get the directory of the current running script. "__file__" is its full path
    path, fl = os.path.split(os.path.realpath(__file__))
    #use path to create the fully classified path to your data
    full_path = os.path.join(path, filename)
    with open(full_path, "r") as file:
       #etc

答案 1 :(得分:2)

您的资源文件与您的脚本相关。这没关系,但你需要使用

os.path.realpath(__file__)

os.path.dirname(sys.argv[0])

获取脚本所在的目录。然后使用os.path.join()或其他函数生成资源文件的路径。