试图读取与 python 文件相同目录中的文件,但出现 FileNotFoundError

attempting to read file in same directory as python file but getting FileNotFoundError

以上是和python同目录下的文件

文件正在 private_key.pem

python 文件 cloudfrontsignedcookie.py

cloudfrontsignedcookie.py 文件中,我们有以下代码

 print('its about to happen yo.........................')
 with open('private_key.pem', 'r') as file_handle:
      private_key_string = file_handle.read()
      print('here is the stuff')
      print(private_key_string)

但是我收到以下错误:

File "/Users/bullshit/Documents/softwareprojects/shofi/backend/virtualshofi/backend/cloudfrontsignedcookie/cloudfrontsignedcookie.py", line 28, in generate_signed_cookies
    return dist.create_signed_cookies(resource,expire_minutes=expire_minutes)
  File "/Users/bullshit/Documents/softwareprojects/shofi/backend/virtualshofi/backend/cloudfrontsignedcookie/cloudfrontsignedcookie.py", line 89, in create_signed_cookies
    with open('private_key.pem', 'r') as file_handle:
FileNotFoundError: [Errno 2] No such file or directory: 'private_key.pem'

我做错了什么?

有一个 posix 属性 称为“当前工作目录”,或 cwd,有时简称为“工作目录”。当您 运行 一个脚本时,该脚本 运行 位于您 cwd 的上下文中,而不是脚本所在的路径。在交互式 shell 中,cwd 由当前 shell 会话所在的目录定义,而此 属性 由您 运行 中的任何命令继承那个互动环节。脚本的位置不同。请参阅此代码:

#!/usr/bin/env python3

from pathlib import Path

print(f'{Path.cwd()=}')
print(f'{Path(__file__).parent=}')

当我运行那个的时候,我看到了这个:

$ pwd  # print working directory
/tmp
$ /Users/danielh/temp/2022-05-30/path-problem.py
Path.cwd()=PosixPath('/private/tmp')
Path(__file__).parent=PosixPath('/Users/danielh/temp/2022-05-30')

所以你可以看到,cwd 就是我当前的 shell 所在的位置。

有几种方法可以继续更改脚本以满足您的需要:

  1. 您可以将private_key.pem移动到您当前的工作目录
  2. 您可以让您的脚本在 Path(__file__).parent 中查找 private_key.pem 文件,这是您的脚本所在的目录
  3. 您可以使用命令行参数来指定查找 private_key.pem 的目录。我认为这是最好的路径。您还可以将此与选项 1 结合使用,如果省略参数,则使用当前工作目录作为默认目录。