Python 3 длинное имя файла в качестве аргумента (Python разбивает его)

У меня возникла проблема с принятием аргумента командной строки в окнах с длинным именем файла и передачей его функции.

Короче говоря, длинное имя файла, содержащее пробелы, разбивается на отдельные части.

Я сделал скомбинированный фрагмент кода, чтобы предоставить мне всю командную строку в целом, но он далек от идеала, поскольку, хотя он работает для нескольких параметров, он не работает для LFN с пробелами. (Ключ был создан для другого скрипта, я только что скопировал его на этот) Я часами искал в Google, пытаясь понять это, так как наверняка кто-то другой решил это. Я пробовал использовать ArgParse, но не смог получить имя файла, не разделяя его.

Будет ли кто-нибудь достаточно любезен, чтобы показать мне код, демонстрирующий получение командной строки в том виде, в котором она есть (без имени сценария), а также получение полного имени файла.

Спасибо Адам

[edit ..] Я попытался заключить его в кавычки, но все равно ничего не вышло. Из тестирования кода я знаю, что он разбивает ввод на пробелы и удаляет кавычки. пример из другого теста:

код test.py:

import sys

print ('Number of arguments:', len(sys.argv), 'arguments.')
print ('Argument List:', str(sys.argv))
for x in range(0, len(sys.argv)):
    print("->" + sys.argv[x])

выход:

H:\bin>test "test lfn.txt" 
Number of arguments: 3 arguments. 
Argument List: ['H:\\bin\\test.py', ' test', 'lfn.txt']
->H:\bin\test.py
-> test
->lfn.txt

#

[править 2] Я думаю, что это ошибка Python в Windows, так как двойные кавычки работают, вроде:

H:\bin>test ""test lfn.txt""
Number of arguments: 2 arguments.
Argument List: ['H:\\bin\\test.py', ' "test lfn.txt"']
->H:\bin\test.py
-> "test lfn.txt"

исходный код размещен ниже.

###############################################################################
# Renames a single file to ISO date format: YYYYMMDD-HHMMSS                   #
###############################################################################

import datetime, os, sys

def error_filename():
    print("filename doesn't exist maybe.")
    sys.exit(1)

def error_args():
    print("Renames a single file to ISO date format: YYYYMMDD-HHMMSS")
    print("Requires 1 parameter, the filename to rename")
    sys.exit(2)

def error_rename():
    print("Unable to rename")
    sys.exit(3)

cmds = ""
for x in range(1, len(sys.argv)):
     cmds = cmds + sys.argv[x]
cmds = cmds.strip()
if cmds != "":
    d = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
    if os.path.isfile(cmds):
        fn = cmds.split(os.extsep)
        fn[0]=d
        newname = d + "." + fn[1] 
        print(cmds + " -> " + newname)
        try:
            os.rename(cmds, newname)
        except:
            error_rename()
    else:
        error_filename()

else:
    error_args()

person Adam Mead    schedule 31.12.2014    source источник
comment
Мы не знаем, как выглядит ваш ввод.   -  person Ignacio Vazquez-Abrams    schedule 31.12.2014
comment
Вы заключаете имя файла в командной строке в кавычки? Если нет, то сделайте это. В противном случае пробел является разделителем аргументов - он не имеет никакого отношения к длине.   -  person cdarke    schedule 31.12.2014
comment
Ваш первый цикл можно было бы записать как cmd = ' '.join(sys.arg[1:]), но что произойдет, если имя файла содержит табуляции или имеет ДВА пробела между каждым компонентом? Ваш дизайн может работать только в том случае, если используется только одно пространство.   -  person cdarke    schedule 31.12.2014


Ответы (1)


Ошибка, с которой я столкнулся, заключалась в том, что Windows 7 ранее по умолчанию открывала файлы python в редакторе, я вручную изменил его в реестре, чтобы открыть с помощью python. Выполнив чистую установку на другом компьютере и позволив установщику python настроить путь и т. Д., Он работал нормально. Проблема заключается в настройках реестра Windows.

person Adam Mead    schedule 31.12.2014
comment
Какой редактор? Как выполнялся ваш сценарий? (был ли редактор каким-то образом запущен?) Этот ответ не предоставляет достаточно информации для решения проблемы, если у кого-то есть такая же проблема, и в зависимости от того, что это такое, это может быть ошибка, о которой следует сообщить в редакторе. - person Random832; 31.12.2014