2

我有一个具有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。

我尝试使用

#!python2.7.5

http://redsymbol.net/articles/env-and-python-scripts-version/

但我无法让它工作......在我的python 2.5.5中,我可以将脚本作为 execfile("c:/script/test.py") 执行

问题是 2.7.5 有一个模块 comtypes + 其他几个。我不知道如何为我的 2.5.5 安装它,所以我试图启动一个单独的脚本并在 python27 下运行它。现在我想要它的另一个原因是因为我想减轻程序的负担。我有 2 项繁重的任务要执行。第二项任务是需要 comptypes 的任务,因此将其发送到外部 shell/app 将是完美的把戏。有没有办法做到这一点?

我希望我可以输入 run("C:/Python27/python.exe % C:/script/test,py")

谢谢再见。

小更新。我试着跑

import os 
os.system("\"C:\Python27\python.exe\" D:\test\runTest.py")

但是我得到一个快速弹出和关闭窗口,说导入错误:没有名为站点的模块...如果我从外部 shell 运行而不是从这里运行,这将有效:(

所以这次我尝试了另一种方法来向python添加模块......无论如何我运行这个:

import os 
import sys
sys.path.append("C:/python27")
sys.path.append("C:/Python27/libs")
sys.path.append("C:/Python27/Lib")
sys.path.append("C:/Python27/Lib/logging")
sys.path.append("C:/Python27/Lib/site-packages")
sys.path.append("C:/Python27/Lib/ctypes")
sys.path.append("C:/Python27/DLLs")    
import PyQt4
print PyQt4   
import comtypes
import logging

但它因 C 错误而崩溃... 运行时错误:程序:c:\Pr... R6034 应用程序试图错误地加载 C 运行时库。废话……

我怎样才能导入它?也许如果我可以导入它,我可以直接从我的应用程序运行它,而不是启动单独的 python ...

Traceback (most recent call last):
  File "<string>", line 18, in <module>
  File "C:\Python27\Lib\site-packages\comtypes\__init__.py", line 22, in <module>
    from ctypes import *
  File "C:\Python27\Lib\ctypes\__init__.py", line 10, in <module>
    from _ctypes import Union, Structure, Array
ImportError: DLL load failed: A dynamic link library (DLL) initialization routine failed.

isseu 的另一个更新

所以我现在跑

import os
os.system("start cmd {D:\test\runTest.py}")

现在这可行,他用 c:\Python27 作为目录打开 CMD,但他不运行文件...任何问题如何解决?

4

1 回答 1

0

使用“原始”字符串,这样您就不需要转义太多;我认为反斜杠是破坏你的代码的原因,因为反斜杠被认为是一个转义字符,除了在原始字符串中。

另外,使用subprocess模块。它可以轻松避免手动创建安全的命令字符串(模块会为您处理)。您需要做的就是将参数列表传递给它。

您的代码将如下所示:

import subprocess 

proc = subprocess.Popen([r"C:\Python27\python.exe", r"D:\test\runTest.py"])

# then either do this
proc.wait()  # wait until the process finishes

# or this
while True:
    # NOTE: do something else here

    # poll the process until it is done
    if proc.poll() is not None:
        break  # break out of loop

在此处查看 Python 2 的子流程文档。请务必检查是否在 Python 2.5 之后添加了某个功能(AFAIK 不再在线提供 2.5 文档)。

更新:

我刚刚注意到您尝试在 2.5 代码中使用 Python 2.7 库和模块。由于 2.5 之后添加的新功能,这可能不起作用。但这让我开始思考如何才能使 2.7 工作。

可能是你的 Python2.7 安装找不到它的库;这可能就是您收到错误的原因Import Error : no module named site。您可以执行上述操作并在启动子进程之前PYTHONPATH修改环境变量,如下所示:

import os
import subprocess 

paths = [r"C:\python27", r"C:\python27\libs", r"C:\python27\Lib\site-packages", r"C:\python27\DLLs"]
paths += os.environ.get('PYTHONPATH', '').split(os.pathsep)

env27 = dict(os.environ)
env27['PYTHONPATH'] = os.pathsep.join(paths)

proc = subprocess.Popen([r"C:\Python27\python.exe", r"D:\test\runTest.py"], env=env27)
于 2015-11-30T18:08:50.513 回答