os.makedirs 当 运行 来自 Linux centos 7.0 终端而不是来自 python 控制台时的问题

os.makedirs problem when running from Linux centos 7.0 terminal but NOT from python console

我有一个 python 3 代码:

system_name = 'myName'
path_perf_folder = os.path.dirname(sys.argv[0]) + '/' + system_name + '_test/'

try:
    coriginal_umask = os.umask(0)
    os.makedirs(path_perf_folder, 0o755)
finally:
    os.umask(original_umask)

代码 运行s 完全来自 python 控制台(运行ning 直接 os.makedirs 命令未经许可和 umask 东西),但是当我 运行来自 Linux Centos 7.0 终端或 MacOS 10.14.1 终端它不起作用。

我已经尝试了不同的权限(0o770 和 0o777),但我的错误一直是:

  File "performance_maker.py", line 130, in <module>
  os.makedirs(path_perf_folder, 0o755)
  File "/shared/centos7/python/3.7.0/lib/python3.7/os.py", line 221, in 
  makedirs
  mkdir(name, mode)
  PermissionError: [Errno 13] Permission denied: '/myName_test/'

来自 Whosebug 问题的 umask 部分 c/p 但它对我不起作用 here is the link

谢谢!

os.path.dirname(sys.argv[0]) 只有在 sys.argv[0] 中有路径分隔符(即类 unix 系统的“/”)字符时才会是非空字符串。像您一样使用字符串操作来构建路径意味着您将尝试在 / 下创建目录,您可能没有写入权限。相反,您应该使用 os.path.join 来构建您的路径,以便正确处理空字符串并获得您想要的相对路径。

当从命令行 运行 时,您的脚本可能只获取脚本的文件名,而不是完整路径。因此,当在命令行 运行 时,您的脚本试图在根 ("/") 文件夹中创建 mkdir。请参阅下面的快速脚本,您可以 运行 查看您的系统如何工作。

import os, sys

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

print('sys.argv[0] is     {}'.format(sys.argv[0])) # See difference from REPL and when run as script
print('cwd is             {}'.format(os.getcwd())) # Might be what you want
print('dirname is:        {}'.format(dirname_out))
print('dirname of cwd is: {}'.format(os.path.dirname(os.getcwd()))) # Not recommended

根据您希望脚本运行的方式,您的解决方案会有所不同。我不确定您想要的结果,因为您在执行脚本时没有提供输入。

如果你想要 运行 脚本并且总是在你 运行 脚本的同一目录中创建新目录,你可能想要我们 "os.getcwd()" 来创建基本目录.

如果您想提供创建目录的位置,那么您可能希望通过检查、解析和构造从 sys.argv[1].

将目录传递给脚本