【问题标题】:Issue Launching Application's: Last 2 Line's of Script问题启动应用程序:最后 2 行脚本
【发布时间】:2013-08-03 08:03:53
【问题描述】:

所以问题是我无法让我的脚本的最后两行成功运行到底部,我 95% 对它为什么会在底部出现问题感到困惑。

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

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

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)

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

【问题讨论】:

    标签: python python-2.7 subprocess shutil


    【解决方案1】:

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

    尝试:

    subprocess.Popen()
    

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

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

    两个基本的调试技巧

    1. 了解如何在调试器下运行并逐步执行代码或
    2. 打印带有可识别文本的语句,例如print 'Start'print 'About to call xxx' 在代码中的开始、结束、中间和四分之一点,看看它们是否都打印出来。如果他们不这样做,那么问题出在要打印的最后一张和下一张之间,因此请添加更多打印。

    【讨论】:

    • subprocess.Popen() 是我目前正在测试的内容,当我使用命令提示符运行它时,它似乎没有报告任何问题实际上正在发生,这让我很困惑。但我认为您可能是正确的关于上面导致我的问题的一行
    • 我会尝试在上述行的任一侧添加打印以确保它正在返回。我还会尝试打印 data_dir 以确保该值有效。
    • 嘿,我不确定这是否会引发任何其他想法,但我只是测试了脚本和启动命令之前的最后一行实际上运行正常。所以我认为这实际上可能是他们自己的命令。
    • 如果在另一个脚本中使用 Popen 格式命令会发生什么?
    • 我尝试了打印的想法,但它实际上并没有将它输出到命令提示符中(我把上面测试的脚本贴在上面,以防我误会你的意思)
    【解决方案2】:

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

    感谢 StackOverFlow 的无名英雄 Falsetru 的留言/纪念碑(如果不感兴趣,请跳过):只想感谢 falsetru 是我迄今为止在 stackoverflow 上遇到的最好和最包容的用户之一,他真的是对于像我这样的任何新用户来说,这是一个完美榜样的海军上将示例,如果没有 falsetru,我无法在上周取得我所拥有的成就。由于他的承诺和理解形式的耐心,他对我的教育和进步至关重要

    谢谢你

    最终脚本 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-07
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      相关资源
      最近更新 更多