【问题标题】:Relative paths break when executing Python script from Windows batch?从 Windows 批处理执行 Python 脚本时,相对路径会中断吗?
【发布时间】:2013-09-02 13:20:00
【问题描述】:

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

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

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

执行失败./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")

【问题讨论】:

    标签: python windows batch-file relative-path


    【解决方案1】:

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

    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
    

    【讨论】:

    • 它不应该是相对于 脚本 的位置...?
    • 它也与windows无关。 *nix 上的相同行为。
    【解决方案2】:

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

    os.path.realpath(__file__)
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2023-02-22
      • 2012-10-04
      • 2010-09-17
      • 1970-01-01
      • 2013-11-25
      相关资源
      最近更新 更多