Python、os.system和subprocess.call都是don';不适用于变量字符串命令

Python、os.system和subprocess.call都是don';不适用于变量字符串命令,python,subprocess,os.system,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相当陌生,所以请原谅,如果这是一种为包含许多变量的目录名构造字符串的奇怪方式。但是,print函数总是

我试图使用python向另一个应用程序发出命令,但它似乎只确认了部分命令。以下是有问题的代码行:

command = 'potreeconverter {} -q NICE -p {} –o {}\{}\{}\{}'.format(path,folder,pathup[0],cid,wpid,folder)
print (command)
os.system(command)
我对Python相当陌生,所以请原谅,如果这是一种为包含许多变量的目录名构造字符串的奇怪方式。但是,print函数总是返回我想要的确切命令,如果我只是手动将其复制并粘贴到命令提示符中,它将按预期运行

potreeconverter C:\Users\thomas\source\test.las -q NICE -p test –o C:\Users\thomas\source\55555\55555\test
该命令被应用程序接受,但它忽略了-o参数,该参数指定应用程序的输出目录。如果我使用subprocess.call,它也会做同样的事情。命令的任何其他部分都不会被忽略

我了解到,这个问题可以通过让python将命令写入批处理文件,然后通过发送批处理文件来解决。我真的不想那样做,因为这样做效率很低。有没有其他人知道的避免这种情况的方法


此外,我不确定这意味着什么,但我认为这是奇怪的,也许意义重大。出现此问题时,并且仅当出现此问题时,程序选择的默认输出目录(而不是我指定的目录)将使用前斜杠而不是反斜杠。

您需要转义反斜杠。
反斜杠是一种特殊字符,这就是为什么您可以对特殊字符进行编码,例如制表符(
\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'
>>>
这里有三个主要优点:它可以根据系统的不同在
/
\
之间进行选择(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))
您的代码也可以工作,但这是使用路径的推荐方法。

如果你有任何问题,请提问。祝你有愉快的一天

为了确保我不会让每个人都被绞死,我想出了解决办法。这很奇怪。我所做的只是以不同的顺序调用参数,现在它每次都能工作。如果我手动输入命令,它们可以按任何顺序工作,但是如果我从python发出命令,它似乎只有在我先编写输出参数的情况下才能工作。不确定这是否是python或我正在编写命令的应用程序的问题。

os.system()
返回的值是多少?我将命令设置为一个变量并打印了它,它返回了0。如果它返回了零,则它似乎工作正常。您需要查看
potreeconverter
,例如,您是否有多个版本?
potreecoverter
是否接受带有\目录分隔符的文件路径<代码>/可以在Windows上工作顺便说一下,这可能值得一试。是的,正斜杠在Windows上大部分都可以工作,但我相信在一些较旧的程序中除外。我会尝试一下,同时也要确保没有可能不同版本的potreeconverter,这可能是python最先看到的,但不正确。非常感谢您提供的超级全面的答案!但实际上所有这些方法都给出了我已经得到的相同结果。你知道为什么吗?不,我不知道,这很奇怪。如果可以的话,你可以发布整个代码或者一个最小的、可运行的示例,这样我就可以试试了吗?我可以看看当你调用
print(command)
时你得到了什么,或者也可以试着把它写入一个文件,看看它是如何编码的吗?在我花时间去做之前,在考虑了一会儿之后,我想我可能知道是什么导致了它。我在窗户上。您是否认为我使用python而不是Windows命令shell这一事实可能会使应用程序误以为它没有在Windows计算机上运行,从而导致此问题?它默认的输出目录是以Unix/Linux格式编写的,但只有在我通过python发出命令时才这样做。这似乎不太可能,但如果您使用的是cygwin之类的工具,可能会这样做,但我不知道