- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想制作一个带有便利函数的 python 模块,以便在 Windows 上使用 Python 3.7 并行运行命令。 (对于 az cli 命令)
我想要一个函数:
这出奇地困难,我想也许这在旧版本的 python 中是不可能的? (我看到几个 2-8 岁的问答说你必须使用 if __name__==__main__:
来完成并行处理,但我发现在制作可导入模块时,它并不能以一致可预测的方式工作。
def removeExtraLinesFromString(inputstring):
stringtoreturn = ""
for line in inputstring.split("\n"):
if len(line.strip()) > 0: #Only add non empty lines to the stringtoreturn
stringtoreturn = stringtoreturn + line
return stringtoreturn
def runCmd(cmd): #string of a command passed in here
from subprocess import run, PIPE
stringtoreturn = str( run(cmd, shell=True, stdout=PIPE).stdout.decode('utf-8') )
stringtoreturn = removeExtraLinesFromString(stringtoreturn)
return stringtoreturn
def exampleOfParrallelCommands():
if __name__ == '__main__': #I don't like this method, because it doesn't work when imported, refractoring attempts lead to infinite loops and unexpected behavior.
from multiprocessing import Pool
cmd = "python -c \"import time;time.sleep(5);print('5 seconds have passed')\""
cmds = []
for i in range(12): #If this were running in series it'd take at least a minute to sleep 5 seconds 12 times
cmds.append(cmd)
with Pool(processes=len(cmds)) as pool:
results = pool.map(runCmd, cmds) #results is a list of cmd output
print(results[0])
print(results[1])
return results
当我尝试将其作为模块导入时,它不起作用(因为 if 语句而导致),所以我尝试重写代码以移动 if 语句,我想我删除了它一次,这导致我的计算机进入循环直到我关闭程序。还有一次,我能够将模块导入到另一个 python 程序中,但为了使其工作,我必须添加 __name__ == '__main__'
这非常直观。
我几乎放弃了,但是经过 2 天的搜索大量 python 网站和 SO 帖子后,在这个问答中看到用户 jfs 的代码后,我终于想出了如何做到这一点( Python: execute cat subprocess in parallel ),我修改了他的代码,所以它' d 更适合我的问题的答案。
最佳答案
工具箱.py
def removeExtraLinesFromString(inputstring):
stringtoreturn = ""
for line in inputstring.split("\n"):
if len(line.strip()) > 0: #Only add non empty lines to the stringtoreturn
stringtoreturn = stringtoreturn + line
return stringtoreturn
def runCmd(cmd): #string of a command passed in here
from subprocess import run, PIPE
stringtoreturn = str( run(cmd, shell=True, stdout=PIPE).stdout.decode('utf-8') )
stringtoreturn = removeExtraLinesFromString(stringtoreturn)
return stringtoreturn
def runParallelCmds(listofcommands):
from multiprocessing.dummy import Pool #thread pool
from subprocess import Popen, PIPE, STDOUT
listofprocesses = [Popen(listofcommands[i], shell=True,stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) for i in range(len(listofcommands))]
#Python calls this list comprehension, it's a way of making a list
def get_outputs(process): #MultiProcess Thread Pooling require you to map to a function, thus defining a function.
return process.communicate()[0] #process is object of type subprocess.Popen
outputs = Pool(len(listofcommands)).map(get_outputs, listofprocesses) #outputs is a list of bytes (which is a type of string)
listofoutputstrings = []
for i in range( len(listofcommands) ):
outputasstring = removeExtraLinesFromString( outputs[i].decode('utf-8') ) #.decode('utf-8') converts bytes to string
listofoutputstrings.append( outputasstring )
return listofoutputstrings
main.py
from toolbox import runCmd #(cmd)
from toolbox import runParallelCmds #(listofcommands)
listofcommands = []
cmd = "ping -n 2 localhost"
listofcommands.append(cmd)
cmd = "python -c \"import time;time.sleep(5);print('5 seconds have passed')\""
for i in range(12):
listofcommands.append(cmd) # If 12 processes each sleep 5 seconds, this taking less than 1 minute proves parrallel processing
outputs = runParallelCmds(listofcommands)
print(outputs[0])
print(outputs[1])
输出:
Pinging neokylesPC [::1] with 32 bytes of data: Reply from ::1: time<1ms Reply from ::1: time<1ms Ping statistics for ::1: Packets: Sent = 2, Received = 2, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms
5 seconds have passed
关于python - 如何制作一个具有并行运行命令行工具功能的 python 模块(不使用 if __name__ == '__main__' : so it's importable)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53983147/
在尝试执行类似于 ActiveState 配方中标题为 Constants in Python 的操作时通过 Alex Martelli,我遇到了意想不到的副作用(在 Python 2.7 中),将类
我正在尝试编写一个类来捕获任何通用函数调用,然后尝试使用它进行一些操作。 作为示例,我尝试使用 here 中类似问题的答案. 但是,当我尝试通过分配 __name__ 属性来更改方法的名称时,它会抛出
这个问题在这里已经有了答案: Why does cls.__name__ not appear in dir()? (4 个答案) 关闭 5 年前。 Class_object 的名称可以通过.__n
n = 20 print n.__name__ 我收到一个错误,因为 n 没有属性 __name__: AttributeError: 'int' object has no attribute '_
在 Python 中,您可以通过 __file__ 获取正在执行的文件的路径是否有等效的 java? 还有一种方法可以像 __name__ 一样获取你当前所在的包吗? 最后,Java 自省(intro
在 rootes.js 中 .state('main.mydata', { url: '/my-data', templateUrl: '/app/views/pages/my-dat
我尝试在网上寻找答案,但找不到。我对 python 相当陌生,想知道程序中是否可以有多个 main 函数。例如: ask_user = int(input('enter your choice (1
在我的 Python Shell 中,删除 __name__ 使其成为 'builtins'。虽然,检查 globals 确认我没有从某个全局变量中引用 __name__。 Python 3.6.2
__name__ 是做什么的?我只看到它与 __main__ 配对,没有其他。 我知道经典的 if __name__ == __main__: 定义了作为包运行与作为独立运行时的行为。 但是 __na
我正在通过阅读 Dive Into Python 来学习 Python在网上,在第 2 章中,我看到您可以使用 __name__ 属性进行测试,所以我想知道,是否有人知道此属性的其他用途?谢谢 最佳答
我正在尝试在我的应用程序中实现基于角色的权限。我有一个装饰器 role_required,我可以将一组用户角色传递到其中,只有具有该角色的用户才能访问该 View 。我已经为用户正确分配了角色,但是,
我正在使用 if __name__ == "__main__": 运行我定义的函数。 然而,作为一种错误捕获措施,我正在尝试实现一种方法来确保文件路径已正确输入到运行我的脚本的 .bat 文件中,文件
要获取类名的字符串表示,我们可以使用 obj.__class__.__name__是否可以重载这些方法以便我可以返回我的字符串而不是实际的类名? 最佳答案 让我们试试吧! (是的,这有效): >>>
为什么不能声明性地覆盖类名,例如使用不是有效标识符的类名? >>> class Potato: ... __name__ = 'not Potato' ... >>> Potato._
所以我有几个 Django 设置文件,一个用于测试,其他用于不同的客户。 这些设置文件都不会改变 sys.path。 所有这些都包含一个单一的基本设置文件,其中包含 INSTALLED_APPS。 大
为什么不能声明性地覆盖类名,例如使用不是有效标识符的类名? >>> class Potato: ... __name__ = 'not Potato' ... >>> Potato._
当我运行时: exec("print(__name__)") 它打印__main__。 但是当我运行时: exec("print __name__", {}) 它打印builtins。 如何让第二个例
给定以下设置: def mapper(f): def wrapper(items): for x in items: yield f(x) wr
我试图了解分配给 Python 类对象的变量与该类对象的 __name__ 属性之间的关系。例如: In [1]: class Foo(object): ...: pass ...
目录 1.程序入口 2.__name__是什么? 场景1:直接运行脚本 场景2:从其他脚本导入 3.__name__
我是一名优秀的程序员,十分优秀!