Python,os.system和subprocess.call都不适用于可变字符串命令

时间:2018-06-28 21:07:12

标签: python subprocess os.system

我正在尝试使用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 :(得分:0)

您需要转义反斜杠。
反斜杠是特殊字符,这就是为什么您可以对特殊字符进行编码的原因,例如制表符(\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的raw string notation,我个人认为更好,更易于维护:

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))

您的代码也可以使用,但这是使用路径的推荐方法。
如果您有任何问题,请询问。祝你有美好的一天!

答案 1 :(得分:0)

为了确保我不会让每个人都挂着,我想出了解决方案。真奇怪我所做的只是以不同的顺序调用参数,现在每次都可以使用。如果我手动输入命令,它们会以任何顺序工作,但是如果我从python发出命令,则似乎只有先编写输出参数,它才能工作。不确定这是python还是我正在编写命令的应用程序出现问题。