Python、os.system 和 subprocess.call 都不适用于可变字符串命令
Python, os.system and subprocess.call both don't work for variable string command
我正在尝试使用 python 向另一个应用程序发出命令,但它似乎只确认了命令的一部分。以下是有问题的代码行:
command = 'potreeconverter {} -q NICE -p {} –o {}\{}\{}\{}'.format(path,folder,pathup[0],cid,wpid,folder)
print (command)
os.system(command)
我是 Python 的新手,如果这是为包含许多变量的目录名称构造字符串的奇怪方法,请原谅我。但是,打印功能总是 returns 我想要的确切命令,如果我只是手动将其复制并粘贴到命令提示符中,它将 运行 按预期执行。
potreeconverter C:\Users\thomas\source\test.las -q NICE -p test –o C:\Users\thomas\source555555\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 的 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, etc...), 它可以接受任意数量的参数,并且更具可读性。在你的情况下,你可以这样做:
import os.path
base = 'potreeconverter {} -q NICE -p {} –o'
path = os.path.join(pathup[0], cid, wpid, folder)
command = ' '.join((base, path))
您的代码也可以工作,但这是处理路径的推荐方式。
如果您有任何问题,请询问。祝你有美好的一天!
为了确保我不会让每个人都悬而未决,我找到了解决方案。这很奇怪。我所做的只是以不同的顺序调用参数,现在它每次都有效。如果我手动输入命令,它们可以按任何顺序工作,但如果我从 python 发出命令,它似乎只有在我首先写入输出参数时才会起作用。不确定这是 python 的问题还是我正在向其写入命令的应用程序的问题。
我正在尝试使用 python 向另一个应用程序发出命令,但它似乎只确认了命令的一部分。以下是有问题的代码行:
command = 'potreeconverter {} -q NICE -p {} –o {}\{}\{}\{}'.format(path,folder,pathup[0],cid,wpid,folder)
print (command)
os.system(command)
我是 Python 的新手,如果这是为包含许多变量的目录名称构造字符串的奇怪方法,请原谅我。但是,打印功能总是 returns 我想要的确切命令,如果我只是手动将其复制并粘贴到命令提示符中,它将 运行 按预期执行。
potreeconverter C:\Users\thomas\source\test.las -q NICE -p test –o C:\Users\thomas\source555555\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 的 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, etc...), 它可以接受任意数量的参数,并且更具可读性。在你的情况下,你可以这样做:
import os.path
base = 'potreeconverter {} -q NICE -p {} –o'
path = os.path.join(pathup[0], cid, wpid, folder)
command = ' '.join((base, path))
您的代码也可以工作,但这是处理路径的推荐方式。
如果您有任何问题,请询问。祝你有美好的一天!
为了确保我不会让每个人都悬而未决,我找到了解决方案。这很奇怪。我所做的只是以不同的顺序调用参数,现在它每次都有效。如果我手动输入命令,它们可以按任何顺序工作,但如果我从 python 发出命令,它似乎只有在我首先写入输出参数时才会起作用。不确定这是 python 的问题还是我正在向其写入命令的应用程序的问题。