2016-11-12 106 views
0

我写一个脚本来打开使用subprocess.Popen()的notepad.exesubprocess.Popen和相对目录

import subprocess 
command = '%windir%\system32\\notepad.exe' 
process = subprocess.Popen(command) 
output = process.communicate() 
print(output[0]) 

这将引发FileNotFoundError

是否有可能改变/添加到上面代码,使其与相对路径工作? 我尝试在C:\ Windows>中移动脚本后再次失败。同样设置shell = True,但也失败了。 使用os.popen()编写一个类似的脚本工作良好的相对路径,无论脚本是从哪个目录运行,但据我了解popen是不是前进的方式..

在世界的早期步骤编程/ Python的。任何输入非常赞赏。

回答

0

使用os.path.expandvars扩大%windir%

command = os.path.expandvars('%windir%\\system32\\notepad.exe') 

其结果是,那么可以传递到subprocess.Popen的路径。

subprocess.Popen不展开环境变量,如%windir%。 shell可能但你真的不应该依赖shell=True来做到这一点。

1

临提示:当你得到一个错误,要求系统执行命令,打印命令(如果适用,当前的工作目录)。结果往往会让你感到惊讶。

在你的情况,我怀疑你只是缺少一个反斜杠。使用这个来代替:

command = '%windir%\\system32\\notepad.exe' 

之前,你做出的改变,尝试分配后立即打印的command值。我想你会发现“系统”中的领先“s”缺失,而且这个错误是显而易见的。

HTH。

+0

感谢您的提示。我确实尝试了两种方法,在system32之前使用\或\\,但打印效果相同。 – mdn

0

你可以使用原始字符串,以避免增加一倍,你的反斜杠。

command = r'%windir%\system32\notepad.exe' 
+0

谢谢。你知道这个和熊猫一样吗?作为DataFrame.index = DataFrame.index.str.replace(R“(string_to_replace”,“new_string”)?我认为这envoked正则表达式..但现在我认为它只是表示原始字符串为你写的。我已经看到了定期表达式以DataFrame.index.str.replace(r'(\ s \。* \)','new_string')的形式出现,因此令人困惑。 – mdn