我有一个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()吗?
我的工作应该使用并行技术,我是python的新用户.所以我想知道你是否可以分享一些关于python multiprocessing和subprocess模块的资料.这两者有什么区别?
我对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) 我有一个名为的脚本1st.py,它创建了一个REPL(read-eval-print-loop):
print "Something to print"
while True:
r = raw_input()
if r == 'n':
print "exiting"
break
else:
print "continuing"
Run Code Online (Sandbox Code Playgroud)
然后我1st.py使用以下代码启动:
p = subprocess.Popen(["python","1st.py"], stdin=PIPE, stdout=PIPE)
Run Code Online (Sandbox Code Playgroud)
然后尝试了这个:
print p.communicate()[0]
Run Code Online (Sandbox Code Playgroud)
它失败了,提供了这个追溯:
Traceback (most recent call last):
File "1st.py", line 3, in <module>
r = raw_input()
EOFError: EOF when reading a line
Run Code Online (Sandbox Code Playgroud)
你能解释一下这里发生了什么吗?当我使用时p.stdout.read(),它会永远挂起.
我正在尝试编写一个启动子进程的Python脚本,并写入子进程stdin.我还希望能够确定子进程崩溃时要采取的操作.
我正在尝试启动的过程是一个程序nuke,它有自己的内置版本的Python,我希望能够提交命令,然后告诉它在执行命令后退出.到目前为止,我已经知道,如果我在命令提示符上启动Python,然后nuke作为子进程启动,那么我可以输入命令nuke,但我希望能够将所有这些都放在一个脚本中,以便主Python程序可以启动nuke然后写入其标准输入(因此也可以写入其内置版本的Python),并告诉它做一些时髦的东西,所以我编写了一个脚本,nuke如下所示:
subprocess.call(["C:/Program Files/Nuke6.3v5/Nuke6.3", "-t", "E:/NukeTest/test.nk"])
Run Code Online (Sandbox Code Playgroud)
然后没有任何事情发生,因为nuke等待用户输入.我现在如何写入标准输入?
我这样做是因为我正在运行一个插件nuke,导致它在渲染多个帧时间歇性地崩溃.所以我希望这个脚本能够启动nuke,告诉它做某事然后如果它崩溃了,再试一次.因此,如果有办法赶上崩溃并且仍然可以,那就太棒了.
我正在尝试从Python中进行比特币支付.在bash中我通常会这样做:
bitcoin sendtoaddress <bitcoin address> <amount>
Run Code Online (Sandbox Code Playgroud)
例如:
bitcoin sendtoaddress 1HoCUcbK9RbVnuaGQwiyaJGGAG6xrTPC9y 1.4214
Run Code Online (Sandbox Code Playgroud)
如果它是成功的我得到一个事务ID作为输出,但如果我尝试转移大于我的比特币余额的数量,我得到以下输出:
error: {"code":-4,"message":"Insufficient funds"}
Run Code Online (Sandbox Code Playgroud)
在我的Python程序中,我现在尝试按以下方式进行付款:
import subprocess
try:
output = subprocess.check_output(['bitcoin', 'sendtoaddress', address, str(amount)])
except:
print "Unexpected error:", sys.exc_info()
Run Code Online (Sandbox Code Playgroud)
如果有足够的余额它可以正常工作,但如果没有足够的余额sys.exc_info()打印出来:
(<class 'subprocess.CalledProcessError'>, CalledProcessError(), <traceback object at 0x7f339599ac68>)
Run Code Online (Sandbox Code Playgroud)
它不包括我在命令行上得到的错误.所以我的问题是; 如何{"code":-4,"message":"Insufficient funds"}从Python中获取输出的错误()?
欢迎所有提示!
如何使用Python subprocess模块执行以下shell命令?
echo "input data" | awk -f script.awk | sort > outfile.txt
Run Code Online (Sandbox Code Playgroud)
输入数据将来自一个字符串,所以我实际上并不需要echo.我已经走到这一步了,任何人都可以解释我是如何通过它来解决的sort吗?
p_awk = subprocess.Popen(["awk","-f","script.awk"],
stdin=subprocess.PIPE,
stdout=file("outfile.txt", "w"))
p_awk.communicate( "input data" )
Run Code Online (Sandbox Code Playgroud)
更新:请注意,虽然下面接受的答案实际上没有回答问题,但我相信S.Lott是对的,最好避免首先解决这个问题!
我正在推出一个使用的程序 subprocess.Popen(cmd, shell=TRUE)
我对Python很新,但感觉就像应该有一些api让我做类似的事情:
subprocess.Popen(cmd, shell=TRUE, postexec_fn=function_to_call_on_exit)
Run Code Online (Sandbox Code Playgroud)
我这样做是为了function_to_call_on_exit能够在知道cmd退出的基础上做一些事情(例如保持当前正在运行的外部进程数的计数)
我假设我可以相当简单地将子进程包装在一个将线程与Popen.wait()方法结合起来的类中,但是因为我还没有在Python中进行线程化,而且看起来这可能是一个常见的API存在,我想我会先尝试找一个.
提前致谢 :)
我正在使用一个科学软件,包括一个os.system()用于运行另一个科学程序的Python脚本.在子进程运行时,Python在某些时候打印以下内容:
close failed in file object destructor:
IOError: [Errno 9] Bad file descriptor
Run Code Online (Sandbox Code Playgroud)
我相信此消息会在os.system()返回的同时打印出来.
我现在的问题是:
哪种情况会导致这种类型的IOError?它究竟意味着什么?对于已被调用的子进程意味着什么os.system()?
是否有一个变体subprocess.call可以运行命令而不打印到标准输出,或阻止它的标准输出消息?