Python, os.system и subprocess.call оба не работают для команды переменной строки - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь передать команду другому приложению, использующему python, но кажется, что оно подтверждает только часть команды. Вот строки кода, о которых идет речь:

command = 'potreeconverter {} -q NICE -p {} –o {}\{}\{}\{}'.format(path,folder,pathup[0],cid,wpid,folder)
print (command)
os.system(command)

Я довольно новичок в Python, так что извините, если это странный способ построить строку для имени каталога, содержащего много переменных. Однако функция печати всегда возвращает именно ту команду, которую я намеревался, и она будет работать так, как задумано, если я просто скопирую и вставлю ее в командную строку вручную.

potreeconverter C:\Users\thomas\source\test.las -q NICE -p test –o C:\Users\thomas\source\55555\55555\test

Команда принята приложением, но игнорирует параметр -o, который указывает выходной каталог для приложения. Это делает то же самое, если я использую subprocess.call. Никакая другая часть команды никогда не игнорируется.

Я прочитал, что эту проблему можно решить, если python записывает команду в командный файл, а затем отправляет командный файл через него. Я бы действительно не хотел этого делать, потому что это было бы неэффективно. Есть ли еще какой-нибудь способ избежать этого?

Кроме того, я не уверен, что это значит, но я подумал, что это странно и, возможно, важно. Когда эта проблема возникает, и только когда она возникает, выходной каталог по умолчанию, который выбирает программа вместо того, который я указал, будет использовать прямую и обратную косые черты.

Ответы [ 2 ]

0 голосов
/ 18 июля 2018

Просто чтобы убедиться, что я не оставлю всех в покое, я нашел решение. Это очень странно Все, что я делал, это вызывал параметры в другом порядке, и теперь это работает каждый раз. Они работают в любом порядке, если я ввожу команду вручную, но если я введу команду из python, кажется, что она будет работать, только если я сначала напишу выходной параметр. Не уверен, что это проблема с python или с приложением, для которого я пишу команду.

0 голосов
/ 29 июня 2018

вам нужно избежать обратной косой черты.
обратная косая черта - это специальный символ, поэтому вы можете кодировать специальные символы, такие как табуляция (\t), символы новой строки (\n) и многое другое.
так что вы можете просто заменить это:

command = 'potreeconverter {} -q NICE -p {} –o {}\{}\{}\{}'.format(path,folder,pathup[0],cid,wpid,folder)  

с:

command = 'potreeconverter {} -q NICE -p {} –o {}\\{}\\{}\\{}'.format(path,folder,pathup[0],cid,wpid,folder) 

Вы также можете использовать необработанную строковую нотацию Python , которую я лично считаю более приятной и проще в обслуживании:

command = r'potreeconverter {} -q NICE -p {} –o {}\{}\{}\{}'.format(path,folder,pathup[0],cid,wpid,folder)

это просто говорит Python не считать любой символ специальным (кроме строк формата, но такого рода не учитывается).
Теперь, что касается того, что вы сказали о том, что это странный способ прокладывать пути, есть лучший способ - os.path.join. это принимает любые аргументы и соединяет их как путь. например, это будет делать:

>>> os.path.join('C:\\tuna', 'fish', 'directory')
'C:\\tuna\\fish\\directory'
>>>

здесь есть 3 основных преимущества: он может выбирать между / или \ в зависимости от системы (\ в Windows \ DOS, / в Unix / Linux и т. Д.), Он может принимать любое количество аргументов, и это более читабельно. в вашем случае вы можете сделать:

import os.path

base = 'potreeconverter {} -q NICE -p {} –o'
path = os.path.join(pathup[0], cid, wpid, folder)
command = ' '.join((base, path))

ваш код тоже будет работать, но это рекомендуемый способ работы с путями.
Если у вас есть какие либо вопросы, пожалуйста спрашивайте. хорошего дня!

...