Python 子流程没有';使用多处理时不尊重参数

Python 子流程没有';使用多处理时不尊重参数,python,linux,multithreading,bash,subprocess,Python,Linux,Multithreading,Bash,Subprocess,这里的主要目标是创建一个守护进程生成函数。守护进程需要运行任意程序(即使用子进程) 到目前为止,我在daemonizer.py模块中拥有的是: import os from multiprocessing import Process from time import sleep from subprocess import call, STDOUT def _daemon_process(path_to_exec, std_out_path, args, shell): with

这里的主要目标是创建一个守护进程生成函数。守护进程需要运行任意程序(即使用
子进程

到目前为止,我在
daemonizer.py
模块中拥有的是:

import os
from multiprocessing import Process
from time import sleep
from subprocess import call, STDOUT


def _daemon_process(path_to_exec, std_out_path, args, shell):

    with open(std_out_path, 'w') as fh:
        args = (str(a) for a in args)

        if shell:
            fh.write("*** LAUNCHING IN SHELL: {0} ***\n\n".format(" ".join([path_to_exec] + list(args))))
            retcode = call(" ".join([path_to_exec] + list(args)), stderr=STDOUT, stdout=fh, shell=True)
        else:
            fh.write("*** LAUNCHING WITHOUT SHELL: {0} ***\n\n".format([path_to_exec] + list(args)))
            retcode = call([path_to_exec] + list(args), stderr=STDOUT, stdout=fh, shell=False)

        if retcode:
            fh.write("\n*** DAEMON EXITED WITH CODE {0} ***\n".format(retcode))
        else:
            fh.write("\n*** DAEMON DONE ***\n")


def daemon(path_to_executable, std_out=os.devnull, daemon_args=tuple(), shell=True):

    d = Process(name='daemon', target=_daemon_process, args=(path_to_executable, std_out, daemon_args, shell))
    d.daemon = True
    d.start()

    sleep(1)
尝试在bash中运行此操作时(这将在当前目录中创建一个名为
test.log
的文件。
):

它正确地生成一个启动
ping
的守护进程,但它不尊重传递的参数。如果shell也被设置为
False
,则这是正确的。日志文件清楚地表明它试图在传递参数的情况下启动它

作为概念证明,创建以下可执行文件:

echo "ping -c 5 192.168.1.1" > ping_test
chmod +x ping_test
按计划进行以下工作:

python -c"import daemonizer;daemonizer.daemon('./ping_test', std_out='test.log', shell=True)"
如果我在
多处理.Process
-目标之外测试相同的
调用
代码,它会按预期工作

那么,如何修复这一混乱局面,以便生成带有参数的进程呢

我对完全不同的结构和模块持开放态度,但它们应该包括在标准结构和模块中,并且与Python2.7.x兼容。要求是
守护进程
函数应该可以在一个脚本中异步调用多次,并生成一个守护进程,每个守护进程的目标进程应该能够在不同的CPU上结束。当然,脚本还需要能够在不影响生成的守护进程的情况下结束

作为奖励,我注意到我需要有一个
睡眠
,以便产卵在所有其他情况下都能工作,脚本终止得太快了。有什么办法可以绕过那个任意的黑客攻击和/或我真的需要让它等多久才能安全吗?

你的论点已经被打印出来“用尽”了

首先,你要这样做:

args = (str(a) for a in args)
这将创建一个生成器,而不是列表或元组。因此,当您稍后执行此操作时:

list(args)
这消耗了参数,它们将不会被再次看到。所以你再做一次:

list(args)
然后得到一张空名单

您可以通过注释打印语句来解决此问题,但更好的方法是首先创建一个列表:

args = [str(a) for a in args]
然后您可以直接使用
args
,而不是
list(args)
。而且里面总是有参数。

打印这些参数时,您的参数已经“用完”了

首先,你要这样做:

args = (str(a) for a in args)
这将创建一个生成器,而不是列表或元组。因此,当您稍后执行此操作时:

list(args)
这消耗了参数,它们将不会被再次看到。所以你再做一次:

list(args)
然后得到一张空名单

您可以通过注释打印语句来解决此问题,但更好的方法是首先创建一个列表:

args = [str(a) for a in args]

然后您可以直接使用
args
,而不是
list(args)
。而且它始终包含参数。

请定义“不尊重参数”的含义。
ping
是否使用不同的参数启动?或者它启动后,进程会忽略您刚才传递的参数?在这种情况下,请显示您得到的实际输出以及您期望的结果。请定义“不尊重参数”的含义。
ping
是否使用不同的参数启动?或者它启动后,进程会忽略您刚才传递的参数?在这种情况下,请显示您得到的实际输出和您期望的结果。哈哈,这是一个愚蠢的错误。我想我对睡眠问题感到非常沮丧,以至于错过了这个问题。哈哈,那是一个愚蠢的错误。我想我对
睡眠
问题感到非常沮丧,以至于错过了那个问题。