MacOS下Bash调用Python脚本报FileNotFoundError问题求助
解决Bash脚本调用Python时的FileNotFoundError问题
这个问题的核心很简单:工作目录不一致。
当你手动在终端运行python3 Test.py时,你肯定是先切换到了/Users/JohnDoe/Documents/Projects/目录下,所以Python脚本里的Data/相对路径是相对于这个Projects目录的,自然能找到(或者创建)对应的文件夹和文件。
但当你运行Bash脚本时,默认的工作目录是你的用户主目录/Users/JohnDoe/,而不是Python脚本所在的Projects目录。这时候Python尝试写入Data/xxx.json,其实是在主目录下找Data文件夹,而这个文件夹根本不存在,所以就抛出了FileNotFoundError——要注意,open()函数带w模式时,只会创建文件本身,但不会自动创建上级目录,如果上级目录不存在就会报错。
给你几个可行的解决方案:
方案1:在Bash脚本中切换工作目录
修改你的Bash脚本,先切换到Python脚本所在的目录,再执行脚本:
#!/bin/bash # 切换到Python脚本所在的目录 cd /Users/johndoe/Documents/Projects/ # 执行脚本(现在相对路径就和手动运行时一致了) python3 Test.py
方案2:在Python脚本中使用绝对路径
这种方法更健壮,不管从哪个目录运行脚本都不会出问题。用os.path模块获取脚本自身的目录,然后拼接出Data文件夹的绝对路径:
import os # 获取当前脚本所在的绝对目录 script_directory = os.path.dirname(os.path.abspath(__file__)) # 拼接Data文件夹和目标文件的完整路径 target_file = os.path.join(script_directory, 'Data', f'{filename}.json') with open(target_file, 'w') as outfile: # 这里写你的JSON写入逻辑
方案3:自动创建Data目录(可选)
如果你的Python脚本需要自动创建Data文件夹(比如第一次运行时),可以在打开文件前先检查并创建目录:
import os script_directory = os.path.dirname(os.path.abspath(__file__)) data_folder = os.path.join(script_directory, 'Data') # 如果Data目录不存在,递归创建它(包括上级目录) if not os.path.exists(data_folder): os.makedirs(data_folder) target_file = os.path.join(data_folder, f'{filename}.json') with open(target_file, 'w') as outfile: # JSON写入逻辑
选其中一个方案就能解决你的问题了,推荐方案2或3,因为它们不依赖于运行脚本时的工作目录,适应性更强。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

