1

所以问题是我在让我的脚本的最后两行成功运行到底部时遇到了麻烦,我 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)

弹出测试:

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)

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

4

2 回答 2

1

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

感谢 Falsetru 的消息/纪念碑 StackOverFlow 的无名英雄(如果不感兴趣,请跳过):只想感谢 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)
于 2013-08-03T09:41:55.260 回答
1

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

尝试:

subprocess.Popen()

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

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

两个基本的调试技巧

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