每次执行python代码时不调用import语句

每次执行python代码时不调用import语句,python,command-line,import,Python,Command Line,Import,下面是一个示例python脚本。如何从命令行多次运行此脚本,以便不每次调用导入行?导入语句花费的时间太长,无法加载 import arcpy val = arcpy.GetCellValue_management("D:\dem-merged\lidar_wsg84", "-95.090174910630012 29.973962146120652", "") print str(val) 据我所知,模块只导入一次。因此,如果你这样做: import a import a 它只会被导入一次。

下面是一个示例python脚本。如何从命令行多次运行此脚本,以便不每次调用导入行?导入语句花费的时间太长,无法加载

import arcpy
val = arcpy.GetCellValue_management("D:\dem-merged\lidar_wsg84", "-95.090174910630012 29.973962146120652", "")
print str(val)

据我所知,模块只导入一次。因此,如果你这样做:

import a
import a
它只会被导入一次。因此,与多次运行脚本不同,您可以将其更改为一次生成所有副本


如果您必须多次运行此特定脚本,我认为您无法避免导入,每次都必须导入它。

我能想到的唯一解决方案是,如果需要执行的函数足够小,则手动将所需的单个函数复制到代码中


如果你需要关于如何做到这一点的帮助,只需在评论中提问。

这几乎是不可能的。离开解释器后,导入的模块将不再位于内存中。这类似于要求Firefox在内存中保存大型网页,因为缓存的读取速度太长。一旦Firefox(或Python)被关闭,RAM中的任何东西都将消失

您可以加快加载时间,但风险自负。通过运行

python -O 
你可以让它跑得快一点。您还可以添加另一个“O”以使其运行更快。然而,这会使一些程序出现错误,而且并不总是有效

您可以通过执行以下操作将所需的函数复制到程序中

from arcpy import <what you need>
从arcpy导入

如果您严格要求“从另一个程序调用此脚本。通过在命令行上发出“python script.py”,则此问题没有解决方案。 如果只想执行一次“重导入”,那么只需启动一次python脚本。 考虑启动一个守护进程,它将启动一次,然后处理来自其他程序的调用。这样,所有初始化只需执行一次,下一次调用将很快完成。 如果您将python代码分为两部分(第一部分用于守护进程,第二部分用于守护进程客户端),您将能够从另一个程序调用“python client.py”,但实际的计算将由守护进程执行,该进程只启动一次

例如:

守护进程.py

import socket
#import arcpy

def actual_work():
    #val = arcpy.GetCellValue_management("D:\dem-merged\lidar_wsg84", "-95.090174910630012 29.973962146120652", "")
    #return str(val)
    return 'dummy_reply'


def main():
    sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
    try:
        sock.bind( ('127.0.0.1', 6666) )

        while True:
            data, addr = sock.recvfrom( 4096 )
            reply = actual_work()
            sock.sendto(reply, addr)
    except KeyboardInterrupt:
        pass
    finally:
        sock.close()


if __name__ == '__main__':
    main()
import socket
import sys


def main():
    sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
    sock.settimeout(1)
    try:
        sock.sendto('', ('127.0.0.1', 6666))
        reply, _ = sock.recvfrom(4096)
        print reply
    except socket.timeout:
        sys.exit(1)
    finally:
        sock.close()


if __name__ == '__main__':
    main()
client.py

import socket
#import arcpy

def actual_work():
    #val = arcpy.GetCellValue_management("D:\dem-merged\lidar_wsg84", "-95.090174910630012 29.973962146120652", "")
    #return str(val)
    return 'dummy_reply'


def main():
    sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
    try:
        sock.bind( ('127.0.0.1', 6666) )

        while True:
            data, addr = sock.recvfrom( 4096 )
            reply = actual_work()
            sock.sendto(reply, addr)
    except KeyboardInterrupt:
        pass
    finally:
        sock.close()


if __name__ == '__main__':
    main()
import socket
import sys


def main():
    sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
    sock.settimeout(1)
    try:
        sock.sendto('', ('127.0.0.1', 6666))
        reply, _ = sock.recvfrom(4096)
        print reply
    except socket.timeout:
        sys.exit(1)
    finally:
        sock.close()


if __name__ == '__main__':
    main()

我能想到的一个解决方案是让一个服务器进程持续运行以完成实际工作,而实际上从命令行调用的脚本只向该脚本发出请求。这是一项相当多的工作,但可能是值得的。

简单

使用
cmd
模块编写自己的简单shell,并使用
runpy
模块运行脚本。在shell程序中导入大模块,并使用init_globals将其传递给程序

查看文档中的,应该很清楚如何编写自己的简单shell,即使它只有两个命令,一个用于编辑文件,一个用于运行文件

runpy是Python标准库的一部分,您可能不需要它,但是知道导入和模块加载机制可以由命令shell控制甚至修改是很有用的

您是否曾经想过,当您执行类似于
var1=25
的操作时,“var1”这个名称会出现在哪里?当您以后执行
print var1
时,Python如何找到
var1
所指的内容?答案是这些名称都在一个字典中,如果您了解Python字典是什么以及它们可以做什么,那么这似乎是将名称与值连接起来的问题的一个显而易见的解决方案。但还有更多。Python可以有很多名称空间,您可以像操作字典一样操作这些名称空间。阅读此文以了解
局部
全局
名称空间。下面是另一个有帮助的讨论


像这个问题一样玩弄
exec
,直到你理解它是如何工作的。然后构建命令shell以在开始时一次性导入模块,并编写脚本以仅在模块不可用时导入模块。当脚本从shell内部运行时,模块将已经存在。

查看您的用例(从Ruby on Rails Web服务调用),最简单的方法之一是使用XML-RPC。使用python标准库中的,然后使用ruby客户端(ruby似乎在标准库中有)?

如果不导入arcpy,您希望如何获得它所包含的功能?我正在寻找一种方法来导入或加载它。脚本将从另一个程序调用。通过在命令行上发出“pythonscript.py”并读取其输出。在脚本中导入会导致很多延迟。另一个程序是用什么语言编写的?我正在尝试从Ruby on Rails web服务访问python脚本。我需要在命令提示符下多次运行同一个脚本。无法在一个会话中完成。请比较fastcgi、spamassassin的spamd或EmacClient。也许Pyro可以帮助分离。Pyro看起来不错,但我认为这太过分了。普通UDP套接字是从本地主机上的守护进程获取短文本数据的最简单方法。我已经尝试过了。但其中还有另一个问题。这里是链接对不起,我知道它的旧线程,但我有一些如何错过你的答案之前。你能详细说明一下你的答案吗?我不确定我是否明白。我不是一个真正的python人,但您的解决方案听起来肯定比让服务器运行我的服务要好。