在Python中scp文件的最pythonic方法是什么?我所知道的唯一途径是
os.system('scp "%s" "%s:%s"' % (localfile, remotehost, remotefile) )
Run Code Online (Sandbox Code Playgroud)
这是一个hack,并且在类似Linux的系统之外不起作用,并且需要Pexpect模块的帮助以避免密码提示,除非您已经将无密码SSH设置到远程主机.
我知道Twisted的conch,但我宁愿避免通过低级ssh模块自己实现scp.
我知道paramiko,一个支持ssh和sftp的Python模块; 但它不支持scp.
背景:我正在连接到不支持sftp但支持ssh/scp的路由器,所以sftp不是一个选项.
编辑:这是如何使用SCP或SSH将文件复制到Python中的远程服务器?. 但是,这个问题没有给出一个scp特定的答案来处理python中的键.我希望有一种运行代码的方式
import scp
client = scp.Client(host=host, user=user, keyfile=keyfile)
# or
client = scp.Client(host=host, user=user)
client.use_system_keys()
# or
client = scp.Client(host=host, user=user, password=password)
# and then
client.transfer('/etc/local/filename', '/etc/remote/filename')
Run Code Online (Sandbox Code Playgroud) 注意:这个问题最初是在这里被问到的,但即使没有找到可接受的答案,赏金时间也已过期.我正在重新询问这个问题,包括原始问题中提供的所有细节.
python脚本使用sched模块每60秒运行一组类函数:
# sc is a sched.scheduler instance
sc.enter(60, 1, self.doChecks, (sc, False))
Run Code Online (Sandbox Code Playgroud)
该脚本使用此处的代码作为守护进程运行.
作为doChecks的一部分调用的许多类方法使用子进程模块来调用系统函数以获取系统统计信息:
ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
Run Code Online (Sandbox Code Playgroud)
这可以在整个脚本崩溃之前运行一段时间,并出现以下错误:
File "/home/admin/sd-agent/checks.py", line 436, in getProcesses
File "/usr/lib/python2.4/subprocess.py", line 533, in __init__
File "/usr/lib/python2.4/subprocess.py", line 835, in _get_handles
OSError: [Errno 12] Cannot allocate memory
Run Code Online (Sandbox Code Playgroud)
脚本崩溃后,服务器上的free -m输出为:
$ free -m
total used free shared buffers cached
Mem: 894 345 549 0 0 0
-/+ buffers/cache: 345 549
Swap: 0 …Run Code Online (Sandbox Code Playgroud) 如何从本地Python(3.0)脚本简单地SSH到远程服务器,提供登录/密码,执行命令并将输出打印到Python控制台?
我宁愿不使用任何大型外部库或在远程服务器上安装任何东西.
注意:此问题已通过此处的所有调试尝试的摘要重新询问.
我有一个Python脚本作为后台进程运行,每60秒执行一次.部分原因是调用subprocess.Popen来获取ps的输出.
ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
Run Code Online (Sandbox Code Playgroud)
运行几天后,调用错误:
File "/home/admin/sd-agent/checks.py", line 436, in getProcesses File "/usr/lib/python2.4/subprocess.py", line 533, in __init__ File "/usr/lib/python2.4/subprocess.py", line 835, in _get_handles OSError: [Errno 12] Cannot allocate memory
但是服务器上的free输出是:
$ free -m
total used free shared buffers cached
Mem: 894 345 549 0 0 0
-/+ buffers/cache: 345 549
Swap: 0 0 0
我一直在寻找这个问题,并发现这篇文章说:
解决方案是为服务器添加更多交换空间.当内核要求启动建模器或发现过程时,它首先确保交换存储上有足够的可用空间(如果需要).
我注意到上面的免费输出没有可用的交换.这可能是问题和/或可能存在的其他解决方案吗?
更新2009年8月13日上述代码每60秒调用一次,作为一系列监视功能的一部分.该进程是守护进程,并使用sched安排检查.上述功能的具体代码是:
def getProcesses(self):
self.checksLogger.debug('getProcesses: start')
# …Run Code Online (Sandbox Code Playgroud) 我有一个内存密集型的Python应用程序(介于几百MB到几GB之间).
我有几个非常小的Linux可执行文件,主应用程序需要运行,例如
child = Popen("make html", cwd = r'../../docs', stdout = PIPE, shell = True)
child.wait()
Run Code Online (Sandbox Code Playgroud)
当我运行这些外部实用程序(一次,在长主进程运行结束时)使用subprocess.Popen我有时得到OSError: [Errno 12] Cannot allocate memory.
我不明白为什么......请求的过程很小!
系统有足够的内存用于更多的shell.
我正在使用Linux(Ubuntu 12.10,64位),所以我猜Subprocess调用了Fork.
而Fork分叉我现有的进程,从而使消耗的内存量增加一倍,并且失败了?
"写字复制"怎么了?
我可以在没有fork的情况下生成一个新进程(或者至少没有复制内存 - 重新启动)?
有关:
fork(),vfork(),exec()和clone()之间的区别
我正在做一些生物信息学工作.我有一个python脚本,它一度调用程序来执行一个昂贵的过程(序列对齐......使用大量的计算能力和内存).我用subprocess.Popen调用它.当我在测试用例上运行它时,它完成并完成.但是,当我在完整文件上运行它时,它必须多次为不同的输入集执行此操作,它会死掉.子流程抛出:
OSError: [Errno 12] Cannot allocate memory
Run Code Online (Sandbox Code Playgroud)
我在这里找到了一些链接,这里和这里有类似的问题,但我不确定它们是否适用于我的情况.
默认情况下,序列对齐器将尝试请求51000M的内存.它并不总是使用那么多,但它可能会.加载和处理完整输入后,就无法使用.但是,限制它请求的数量或将尝试使用的数量较少,在运行时可能仍然可用,这会给我带来同样的错误.我也试过用shell = True和同样的东西运行.
这已经困扰了我几天了.谢谢你的帮助.
编辑:扩展回溯:
File "..../python2.6/subprocess.py", line 1037, in _execute_child
self.pid=os.fork()
OSError: [Errno 12] Cannot allocate memory
Run Code Online (Sandbox Code Playgroud)
抛出错误.
Edit2:在64位ubuntu 10.4上运行python 2.6.4
我正在追踪一个内存不足的错误,并惊恐地发现 python 的多处理似乎复制了大数组,即使我无意使用它们。
为什么python(在Linux上)这样做,我认为写时复制可以保护我免受任何额外的复制?我想,每当我引用对象时,都会调用某种陷阱,然后才进行复制。
对于任意数据类型(例如 30 GB 的自定义字典使用Monitor? 有什么方法可以构建 Python 使其没有这些废话吗?
import numpy as np
import psutil
from multiprocessing import Process
mem=psutil.virtual_memory()
large_amount=int(0.75*mem.available)
def florp():
print("florp")
def bigdata():
return np.ones(large_amount,dtype=np.int8)
if __name__=='__main__':
foo=bigdata()#Allocated 0.75 of the ram, no problems
p=Process(target=florp)
p.start()#Out of memory because bigdata is copied?
print("Wow")
p.join()
Run Code Online (Sandbox Code Playgroud)
跑步:
[ebuild R ] dev-lang/python-3.4.1:3.4::gentoo USE="gdbm ipv6 ncurses readline ssl threads xml -build -examples -hardened -sqlite -tk -wininst" 0 KiB
Run Code Online (Sandbox Code Playgroud) 我编写了一个基本程序来检查包含许多 jpeg 文件(500000+)的目录树,验证它们没有损坏(大约 3-5% 的文件似乎以某种方式损坏),然后对文件(即使是损坏的文件)并将信息保存到数据库中。
有问题的 jpeg 文件位于 windows 系统上,并通过 cifs 安装在 linux box 上。它们的大小大多在 4 兆字节左右,尽管有些可能稍大或稍小。
当我运行该程序时,它似乎工作得很好一段时间,然后它因以下错误而失败。这是在它处理了大约 1100 个文件之后(错误表明问题发生在尝试打开 4.5 兆的文件时)。
现在我明白我可以捕获这个错误并继续或重试等,但我很好奇为什么它首先发生,如果捕获和重试实际上可以解决问题 - 或者它会卡在重试中(除非我当然限制重试但随后会跳过一个文件)。
我在 debian 系统上使用“Python 2.7.5+”来运行它。系统至少有 4 Gig(可能是 8 个)的 ram,并且 top 报告脚本在运行时的任何时候都使用不到 1% 的 ram 和不到 3% 的 cpu。同样,此脚本运行的 jpeginfo 也使用同样少量的内存和 CPU。
为了避免在读取文件时使用太多内存,我采用了本回答中给出的另一个问题的方法:https : //stackoverflow.com/a/1131255/289545
此外,您可能会注意到“jpeginfo”命令在寻找“[OK]”响应的 while 循环中。这是因为如果“jpeginfo”认为它找不到文件,它会返回 0,因此 subprocess.check_output 调用不会将其视为错误状态。
我确实想知道 jpeginfo 在第一次尝试时似乎无法找到某些文件的事实是否可能相关(我怀疑是这样),但返回的错误表示无法分配内存而不是文件未找到。
错误:
Traceback (most recent call last):
File "/home/m3z/jpeg_tester", line 95, in <module>
main()
File "/home/m3z/jpeg_tester", line 32, in __init__
self.recurse(self.args.dir, self.scan) …Run Code Online (Sandbox Code Playgroud)