Python小记-os.system()与空格处理

重新装回Windows10之后,要用Python脚本来打开Maya的应用程序。本来这是一个很简单的问题,直接使用os.system(cmd)来进行处理即可。偏偏就是在这个最没问题的地方,就出了问题。

当运行脚本第一次出现问题如下:

‘C:\Program’ is not recognized as an internal or external command, operable program or batch file.

这句话是说‘C:\Program’不是内部或外部命令,也不是可运行的程序或批处理文件。看到这个报错我第一感觉就是肯定忘了在路径上加双引号了。然后正准备修改代码,发现并不是这一块的问题。

然后我就仔细想了一下,既然引号加了,但从结果来看, os.system() 还是用空格把字符串给拆成了不同的部分,然后再调用shell来执行。但我后来在实验的过程中又发现了一个奇怪的问题:如果参数只是一个加引号的字符串, os.system() 就可以正常执行,但如果有多个引号对,就会出现以上错误。也就是说,如果参数类似”xx yy zz”这样的类型, os.system() 可以成功执行;如果参数类似”xx yy” “aa bb”这样的类型, os.system() 就会出错。

我就从网上找了一下官方对os.system()的解释,如下:

Execute the command (a string) in a subshell. This is implemented by
calling the Standard C function system(), and has the same
limitations. Changes to sys.stdin, etc. are not reflected in the
environment of the executed command.

On Unix, the return value is the exit status of the process encoded in
the format specified for wait(). Note that POSIX does not specify the
meaning of the return value of the C system() function, so the return
value of the Python function is system-dependent.

On Windows, the return value is that returned by the system shell
after running command, given by the Windows environment variable
COMSPEC: on command.com systems (Windows 95, 98 and ME) this is always
0; on cmd.exe systems (Windows NT, 2000 and XP) this is the exit
status of the command run; on systems using a non-native shell,
consult your shell documentation.

The subprocess module provides more powerful facilities for spawning
new processes and retrieving their results; using that module is
preferable to using this function. See the Replacing Older Functions
with the subprocess Module section in the subprocess documentation for
some helpful recipes.

Availability: Unix, Windows.

可以看出, os.system() 是调用了C语言的标准函数 system() ,不过那个limitations单词说这个方法有其局限性。然后一直往后翻才发现原来有人提交过这个bug了,但是官方没有修复,官方给出的解释是os.system() 只是简单地把字符串传递给 system() 函数,自己并不会对字符串进行处理,所以这个bug应该是 system() 函数的问题或者windows shell的问题。

这样第一个的错误排除了,也找到了问题出错的地方了。因为我安装Maya的时候是直接点击下一步,这样Maya就安装在了C:\Program Files\Autodesk\Maya2016\bin 这个路径下面了。所以输入这个命令就会因为空格的原因导致报错。(这里抱怨一下,编码人生,任重道远;珍爱生命,远离Windows;)

找到错误之后我查找了一些如何在命令行中处理空格的资料。因为在cmd黑窗口中输入这个路径也会报错,所以我想了一个解决思路就是先在cmd黑窗口中把这个问题解决掉,然后把这个解决的办法放在os.system()就应该可以。

我最先根据报错的原因怀疑的是是不是在cmd黑窗口中不能直接执行.exe文件(搞得我对自己都产生怀疑了),就先找了用cd进入到bin目录下。然后直接执行 Maya.exe 。这一试还真成了。这就证明cmd是可以执行exe文件的。那么问题还是出在了路径有空格的问题上了。

但是我一想既然有这个问题,而我又没有什么好的解决办法。于是就想换个思路。我可以在Python脚本中,使用subprocess.Pope("cd C:/Program Files/Autodesk/Maya2016/bin")先让他进入到这个目录,然后在下面再让他执行。但是天不遂人愿,下一条执行os.system("maya.exe")是相对于当前文件下的路径来运行的,所以这一条路也走不通了。

然后我就查找命令行中解决空格的方法,然后看到一个博客上面说

当使用Windows中的命令行提示符执行这段指令时(测试Start命令执行带空格的路径的程序或文件问题),第一行Start会成功执行,跳出记事本程序,而第二行,会Start跳出一个新的命令提示符,标题上写着路径,但是不会执行任何命令,第三行Start命令行提示符会提示C:\Program文件不存在,提示无法执行。
start c:\windows\notepad.exe start “C:\Program Files\Internet
Explorer\iexplore.exe” start C:\Program Files\Internet
Explorer\iexplore.exe puase
通常在命令行提示符里遇到程序或者文件路径包含空格时,需要使用双引号将其括起来,或者使用8.3格式,但是这些使用起来都是不方便的。
最终找到原因,原来是双引号代表设置标题,导致我这出现的问题,解决办法很简单,在Start后增加2个双引号即可 start “”
“C:\Program Files\Internet Explorer\iexplore.exe”
通过这个简单的方式,就可以解决Start无法执行路径包含空格的问题了。

我就按照上面说的解决方法在命令行中实验了一下,成了!然后我就照猫画虎把他放到os.system()中,但是这样就需要拼接一下字符串,然后进行实验,结果Python输出窗口报错了。(原因是os.system()不能传两个引号的,具体看上面)。

这种方法也失败了,然后就重新看os.system() 的官方介绍,又仔仔细细的翻译了一遍(英文不好是硬伤啊!),这次看到官方推荐使用subprocess来代替os.system(),然后我就调到subprocess文档中仔细又看了一遍,原来我上面使用subprocess.Pope("cd C:/Program Files/Autodesk/Maya2016/bin")已经很接近了,当时是我的思路非要进入这个目录再执行maya.exe,这样就有点画蛇添足了,其实直接进入就能实现。


参考资料:


附录:

C:\Users\82784>start /? 启动一个单独的窗口以运行指定的程序或命令。

START [“title”] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/NODE ] [/AFFINITY ] [/WAIT] [/B]
[command/program] [parameters]

"title"     在窗口标题栏中显示的标题。
path        启动目录。
B           启动应用程序,但不创建新窗口。
            应用程序已忽略 ^C 处理。除非应用程序
            启用 ^C 处理,否则 ^Break 是唯一可以中断
            该应用程序的方式。
I           新的环境将是传递
            给 cmd.exe 的原始环境,而不是当前环境。
MIN         以最小化方式启动窗口。
MAX         以最大化方式启动窗口。
SEPARATE    在单独的内存空间中启动 16 位 Windows 程序。
SHARED      在共享内存空间中启动 16 位 Windows 程序。
LOW         在 IDLE 优先级类中启动应用程序。
NORMAL      在 NORMAL 优先级类中启动应用程序。
HIGH        在 HIGH 优先级类中启动应用程序。
REALTIME    在 REALTIME 优先级类中启动应用程序。
ABOVENORMAL 在 ABOVENORMAL 优先级类中启动应用程序。
BELOWNORMAL 在 BELOWNORMAL 优先级类中启动应用程序。
NODE        将首选非一致性内存结构(NUMA)节点指定为
            十进制整数。
AFFINITY    将处理器关联掩码指定为十六进制数字。
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值