【问题标题】:Clean handling of file path with spaces in Makefile清洁处理 Makefile 中带有空格的文件路径
【发布时间】:2020-06-18 17:56:31
【问题描述】:

我有一个脚本,它从我无法更改目录名称的服务器驱动器中提取数据,并且它们中都有空格。我正在使用 Makefile 运行脚本(在 Windows 中),但它出现了问题。

我最初的解决方法是在调用 make 将数据从服务器复制到我的本地文件夹之前运行一个 python 脚本,它看起来像这样:

# grab_data.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-o", "--output", help="output filepath")
args = parser.parse_args()
output_path = Path(args.output)

src = 'S:/Server Path/To Data I Need/File I Need.xlsx'
dst = output_path
shutil.copyfile(src, dst)

我像这样运行我的 Makefile:

.PHONY : runall
runall : data/file_i_need.xlsx final_output.csv
    python grab_data.py - o data/file_i_need.xlsx

final_output.csv : data/file_i_need.xlsx processing_script.py
    python processing_script.py -i $< -o $@

我想找到一些方法将文件'S:/Server Path/To Data I Need/File I Need.xlsx' 直接包含在 Makefile 中,但不知道什么会起作用。是否有其他解决方法可以让我这样做?

【问题讨论】:

  • 是的,但它并不比你已有的干净。
  • @Beta:我很好奇你的解决方案是什么;我的问题是程序无法根据服务器副本的更改触发将文件从服务器复制到本地驱动器,这将是理想的。

标签: python python-3.x windows makefile gnu-make


【解决方案1】:

不确定您使用的是哪个版本的 make,但使用 gmake(这可能是 Windows 周围的选项之一)转义空格会起作用:

x\ yz: ab\ c
        cp "$<" "$@"

然后你得到:

$ make
cp "ab c" "x yz" 

正如评论中指出的那样,不要因为太明显而放弃它。我还在配方中使用了双引号变量,以确保这些变量作为一个完整的字符串正确传递。如果一条规则有多个先决条件,而其中只有一个包含空格,那还是一样的,你只需要将它设为第一个先决条件,以便参考"$&lt;"。如果您有多个带有空格的先决条件并想引用所有这些,我担心您可能会运气不好,即使尝试将 $^ 扩展为 $(foreach ...) 也无济于事。

【讨论】:

  • 您演示但没有明确说明,除了在目标名称和先决条件名称中转义空格外,还需要正确引用它们出现的相应特殊变量在食谱中。这很重要,因为您已经提出了一个基本案例。对于具有多个先决条件的规则,这个问题要困难得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2012-08-29
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
相关资源
最近更新 更多