问题启动应用程序:脚本的最后2行

时间:2013-08-03 08:03:54

标签: python python-2.7 subprocess shutil

所以问题是我在编写脚本的最后两行成功运行到底部时遇到了麻烦,我对它为什么会在底部发出错误感到困惑。

理想情况下,我希望这两个应用程序彼此独立启动。我可以使用subprocess.call来启动这两个应用程序,如果我将脚本的所有启动部分/行放出并将它们放入一个新脚本并启动它,因为它与它试图启动的文件位于同一目录中。理想情况下,我想让它从PC上的任何地方运行

顺便说一下,当我用命令promt运行它来测试它时,读出来的是空的(所以我觉得它在某种奇怪的意义上工作)

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")
dest_dir = os.path.join(data_dir, r'Data')
if not os.path.exists(data_dir):
    os.mkdir(data_dir)

if os.path.exists(dest_dir):
    shutil.rmtree(dest_dir)

    shutil.copytree(r"Data", dest_dir)
shutil.copy(r"System32.lnk", menu_dir)
subprocess.call(['explorer.exe', data_dir])
subprocess.call(['PnkBstrA.exe'], cwd=data_dir)

现在任何帮助都会非常有用

感谢的

编辑:顺便说一句,当我只使用启动命令并将它们放入新脚本(下面的错误帖子)时,它一次只启动一个应用程序(第二个应用程序在初始关闭/退出时启动。

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")

subprocess.call(['explorer.exe', data_dir])
subprocess.call(['PnkBstrA.exe'], cwd=data_dir)

打印测试:

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")
dest_dir = os.path.join(data_dir, r'Data')
if not os.path.exists(data_dir):
    os.mkdir(data_dir)

if os.path.exists(dest_dir):
    shutil.rmtree(dest_dir)

shutil.copytree(r"Data", dest_dir)
shutil.copy(r"System32.lnk", menu_dir)
print subprocess.call(['explorer.exe', data_dir])
subprocess.call(['PnkBstrA.exe'], cwd=data_dir)

Popen测试:

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")

subprocess.Popen(['explorer.exe', data_dir])
subprocess.call(['PnkBstrA.exe'], cwd=data_dir)

如果我将它放在与其启动的应用程序相同的文件夹中,这将启动这两个应用程序。 (这不是理想的,但它是一个开始!)

2 个答案:

答案 0 :(得分:1)

从文件中: subprocess.call 运行args描述的命令。等待命令完成,然后返回returncode属性。

尝试:

subprocess.Popen()

在当前正在使用呼叫的所有线路上,您可能需要将路径添加到当前路径上不存在的任何程序。

较长脚本的最后两行可能没有被调用,因为它们之前的一行中有错误,从命令行运行并解决报告的任何问题。

两个基本的调试技巧

  1. 了解如何在调试器下运行并逐步执行代码或
  2. 将带有可识别文本的打印报表放入,例如print 'Start'print 'About to call xxx'代码中的开始,结束,中间和四分之一点,看看它们是否全部打印出来。如果他们不是,那么问题出在最后一个要打印和下一个之间,所以再添加一些打印件。

答案 1 :(得分:1)

让它工作的诀窍是指定我想要启动的.exe文件的整个路径名,并将第一个“call”函数切换为“Popen”。另外我镜像了“subprocess.call(['PnkBstrA.exe'],cwd = data_dir)前面的cwd =”到它上面的那个,我还没有测试这是否必不可少所以你可以玩如果你删除顶部或底部的话,看看它是否仍然起作用。

感谢Falsetru的消息/纪念碑StackOverFlow的UnSung Hero(如果不感兴趣,请跳过):感谢falsetru是我迄今为止在stackoverflow上遇到的最好和最适应的用户之一,他真的是一个像我这样的任何新用户的完美榜样的海军上将的例子,我不可能在上周没有忘记的情况下实现我所拥有的。由于他对耐心的承诺和理解,他对我的教育和进步至关重要

感谢fal'

最终脚本100%工作:

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")
dest_dir = os.path.join(data_dir, r'Data')
if not os.path.exists(data_dir):
    os.mkdir(data_dir)

if os.path.exists(dest_dir):
    shutil.rmtree(dest_dir)

shutil.copytree(r"Data", dest_dir)
shutil.copy(r"System32.lnk", menu_dir)
subprocess.Popen([r'C:\Users\Spanjer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data\Data\explorer.exe'], cwd=data_dir)
subprocess.call([r'C:\Users\Spanjer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data\Data\PnkBstrA.exe'], cwd=data_dir)