Проблема os.makedirs при запуске из терминала Linux Centos 7.0, но НЕ из консоли python - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть код 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)

Код отлично запускается из консоли Python (выполняется непосредственно командой os.makedirs без разрешения и масок), но когда я запускаю из терминала 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/'

Umask часть I c/ p из вопроса stackoverflow, но он не работает для меня вот ссылка

Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

При запуске из командной строки ваш сценарий, вероятно, получает только имя файла сценария, а не полный путь.Поэтому при запуске из командной строки ваш сценарий пытается выполнить 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].

0 голосов
/ 15 декабря 2018

os.path.dirname(sys.argv[0]) будет непустой строкой, только если sys.argv[0] содержит символ разделителя пути (т. Е. '/' Для unix-подобных систем).Использование строковых операций для построения пути, как вы делаете, означает, что вы попытаетесь создать каталог в /, к которому у вас, вероятно, нет прав записи.Вместо этого вы должны использовать os.path.join для построения вашего пути, чтобы пустые строки обрабатывались правильно и вы получали относительный путь, который вы хотите.

...