【问题标题】:Why doesn't my bash script read lines from a file when called from a python script?为什么我的 bash 脚本在从 python 脚本调用时不从文件中读取行?
【发布时间】:2015-03-01 22:26:40
【问题描述】:

我正在尝试用 bash 编写一个小程序,其中一部分需要能够从 txt 文件中获取一些值,其中不同的文件由一行分隔,然后将每一行添加到变量中或添加每行到一个数组。

到目前为止,我已经尝试过:

FILE=$"transfer_config.csv"
while read line
do
    MYARRAY[$index]="$line"
    index=$(($index+1))
done < $FILE
echo ${MYARRAY[0]}

这只是产生一个空行,而不是配置文件第一行的内容。

我没有返回任何错误,这就是为什么我不太确定为什么会发生这种情况。

通过使用os.system("$HOME/bin/mcserver_config/server_transfer/down/createRemoteFolder") 的python 脚本调用bash 脚本,但如果我只是在python 程序生成bash 脚本读取的文件后调用它,它就可以工作。

我几乎 100% 确定这不是目录问题,因为 bash 脚本顶部的 pwd 将其显示在正确的目录中,并且 python 程序也在正确的位置创建数据文件.

非常感谢任何帮助。

编辑:

我还尝试了subprocess.call("path_to_script", shell=True) 看看它是否会有所作为,我知道这不太可能,但它没有。

【问题讨论】:

  • 您使用的是什么版本的 bash?我怀疑循环是在子shell中运行的,因此运行实际脚本的shell看不到对变量的更改,但是较新版本的bash在将stdin重定向到常规文件时不会这样做。(我无法重现该行为使用 bash 4.3)
  • @Wintermute 我正在使用GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)。我将如何阻止您在评论中所说的事情发生?
  • 您的代码对我来说很好用。运行脚本时 csv 文件是否在当前目录中?此外,它可能没有任何区别,但请注意 FILE=$"transfer_config.csv" 会导致文件名根据当前语言环境进行翻译。为避免这种情况,请删除 $
  • 您的 bash 和我的(我的是 4.3.33)不太可能在这里表现不同。文件是否在脚本的工作目录中,运行脚本的用户是否具有读取权限?
  • 只需使用mapfile 而不是您的while 循环:mapfile -t myarray &lt; "$file",并使用declaredeclare -p myarray 检查您的数组的内容。

标签: python arrays bash call


【解决方案1】:

我怀疑从 python 调用 bash 脚本时,刚刚创建了文件,您并没有真正完成该文件:您应该明确关闭文件或使用 with 构造。

否则,写入的数据仍在任何缓冲区中(来自文件对象,或在操作系统中,或任何地方)。只有关闭(或至少刷新)文件才能确保数据确实在文件中。

顺便说一句,您应该使用subprocess 模块而不是os.system...

【讨论】:

  • 这听起来你可能是对的 :) 我在调用 bash 脚本时没有关闭文件。我会在早上测试它。不过我很确定你的权利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 2020-06-18
  • 2019-08-03
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
相关资源
最近更新 更多