我认为运行带有稍微修改环境的外部命令是一种非常常见的情况.这就是我倾向于这样做的方式:
import subprocess, os
my_env = os.environ
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen(my_command, env=my_env)
Run Code Online (Sandbox Code Playgroud)
我有一种直觉,觉得有更好的方法; 看起来好吗?
有没有办法在Python中指定命令的运行目录subprocess.Popen()
?
例如:
Popen('c:\mytool\tool.exe', workingdir='d:\test\local')
Run Code Online (Sandbox Code Playgroud)
我的Python脚本位于 C:\programs\python
是否可以C:\mytool\tool.exe
在目录中运行D:\test\local
?
如何设置子流程的工作目录?
我想从Python调用外部程序.我已经使用了两者Popen()
并且call()
做到了这一点.
这两者有什么区别?
我的具体目标是从Python运行以下命令.我不确定重定向是如何工作的.
./my_script.sh > output
Run Code Online (Sandbox Code Playgroud)
我阅读了文档,它说这call()
是一个便利功能或快捷功能.我们是否通过使用call()
代替Popen()
?而失去了任何力量?
由于os.popen被subprocess.popen取代,我想知道如何转换
os.popen('swfdump /tmp/filename.swf/ -d')
Run Code Online (Sandbox Code Playgroud)
到subprocess.popen()
我试过了:
subprocess.Popen("swfdump /tmp/filename.swf -d")
subprocess.Popen("swfdump %s -d" % (filename)) # NOTE: filename is a variable
# containing /tmp/filename.swf
Run Code Online (Sandbox Code Playgroud)
但我想我没有正确地写出来.任何帮助,将不胜感激.谢谢
我有一个脚本,我用popen启动一个shell命令.问题是脚本不会等到popen命令完成后立即继续.
om_points = os.popen(command, "w")
.....
Run Code Online (Sandbox Code Playgroud)
如何判断我的Python脚本要等到shell命令完成?
有人可以解释为什么我想要的结果,"嗨",前面有一个字母'b',后跟一个换行符?
我使用的是Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
Run Code Online (Sandbox Code Playgroud)
如果我用python 2.7运行它,则不会出现这个额外的'b'
import subprocess
def my_function(x):
return x + 100
output = subprocess.Popen(my_function, 1) #I would like to pass the function object and its arguments
print output
#desired output: 101
Run Code Online (Sandbox Code Playgroud)
我只找到了使用单独脚本打开子进程的文档.有谁知道如何传递函数对象甚至是一种简单的方法来传递函数代码?
我有一个python脚本,必须为dir中的每个文件启动一个shell命令:
import os
files = os.listdir(".")
for f in files:
os.execlp("myscript", "myscript", f)
Run Code Online (Sandbox Code Playgroud)
这适用于第一个文件,但在"myscript"命令结束后,执行停止并且不会返回到python脚本.
我能怎么做?我fork()
以前需要calling os.execlp()
吗?
我对subprocess
使用时如何搜索可执行文件感到困惑Popen()
.如果给定子进程的绝对路径,它可以工作,但我正在尝试使用相对路径.我发现如果我设置环境变量PYTHONPATH然后我可以从该路径获得导入的模块,并且PYTHONPATH存在sys.path
,但它似乎没有帮助的行为subprocess.Popen
.我也尝试过编辑sitecustomize.py
添加PYTHONPATH 的文件os.environ
,就像这样
# copy PYTHONPATH environment variable into PATH to allow our stuff to use
# relative paths for subprocess spawning
import os
if os.getenv('PYTHONPATH') is not None and os.getenv('PATH') is not none:
os.environ['PATH'] = ':'.join([os.getenv('PATH'), os.getenv('PYTHONPATH')])
Run Code Online (Sandbox Code Playgroud)
并且验证了在启动python时,无论是交互式地,使用ipython,还是通过从命令行运行脚本,PYTHONPATH都成功出现os.environ
.但是,subrocess.Popen
仍然不在那里搜索可执行文件.如果没有env
指定kwarg ,我认为它应该继承父母的环境?接下来我尝试env
明确地给出,首先通过制作副本,os.getenv
然后仅仅通过给予env={'PATH': '/explicit/path/to/search/from'}
,它仍然找不到可执行文件.现在我很难过.
希望一个例子可以帮助我更清楚地解释我的问题:
/ dir/subdir1/some_executable
/dir/subdir2/some_script.py
# some_script.py
from subprocess import Popen, PIPE
spam, eggs = Popen(['../subdir1/some_executable'], …
Run Code Online (Sandbox Code Playgroud) 这是我的想法:
首先,我使用subprocess.Popen创建了一个进程
第二,经过一段时间后,我试图通过Popen.kill杀死它()
import subprocess
import os, signal
import time
proc1 = subprocess.Popen("kvm -hda /path/xp.img", shell = True)
time.sleep(2.0)
print 'proc1 = ', proc1.pid
subprocess.Popen.kill(proc1)
Run Code Online (Sandbox Code Playgroud)
但是,"proc1"仍然存在于Popen.kill()之后.任何专家都可以告诉我如何解决这个问题吗?我很感激你的考虑.
感谢所有专家的评论,我做了你所做的一切,但结果仍然保持不变.
proc1.kill() #it sill cannot kill the proc1
os.kill(proc1.pid, signal.SIGKILL) # either cannot kill the proc1
Run Code Online (Sandbox Code Playgroud)
谢谢你们.
我仍然在等待你解决这个微妙问题的宝贵经验.