Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python chdir=1和num_作业的组合>;一个烤饼_Python_Build_Multiprocessing_Scons - Fatal编程技术网

Python chdir=1和num_作业的组合>;一个烤饼

Python chdir=1和num_作业的组合>;一个烤饼,python,build,multiprocessing,scons,Python,Build,Multiprocessing,Scons,我有一个相当长的测试任务,它由SCON自动执行,并且可以并行化。然而,它目前依赖于使用chdir=1,目前要删除它并不容易。现在,只要我分别使用-j2设置选项('num_jobs',2),作业就会失败,下面的最小(非)工作示例说明了原因:chdir不是基于每个线程应用的,而是一次影响所有作业 这种行为是有预谋的吗?有什么办法可以防止这种情况发生吗 # File SConstruct import os, time def my_build_fun(target, source, env):

我有一个相当长的测试任务,它由SCON自动执行,并且可以并行化。然而,它目前依赖于使用
chdir=1
,目前要删除它并不容易。现在,只要我分别使用
-j2
设置选项('num_jobs',2),作业就会失败,下面的最小(非)工作示例说明了原因:chdir不是基于每个线程应用的,而是一次影响所有作业

这种行为是有预谋的吗?有什么办法可以防止这种情况发生吗

# File SConstruct
import os, time

def my_build_fun(target, source, env):
    for i in range(1, 5):
        out = "my_build_fun: %d %s %s" % (i, str(source[0]), os.getcwd())
        print out
        time.sleep(0.5)
    return None

bld = Builder(action = my_build_fun,
              suffix = '.output',
              src_suffix = '.input',
              chdir=1)
env = Environment(BUILDERS = {'Foo' : bld})

Alias('do_a', env.Foo('folder_a/do_a'))
Alias('do_b', env.Foo('folder_b/do_b'))

Default(['do_a', 'do_b'])
手术

+--- SConstruct
+-+- folder_a
| \--- do_a.input
\-+- folder_b
  \--- do_b.input
scons-j1的结果:如预期

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
os.chdir('folder_a')
my_build_fun(["folder_a\do_a.output"], ["folder_a\do_a.input"])
my_build_fun: 1 folder_a\do_a.input H:\Playground\folder_a
my_build_fun: 2 folder_a\do_a.input H:\Playground\folder_a
my_build_fun: 3 folder_a\do_a.input H:\Playground\folder_a
my_build_fun: 4 folder_a\do_a.input H:\Playground\folder_a
os.chdir('H:\\Playground')
os.chdir('folder_b')
my_build_fun(["folder_b\do_b.output"], ["folder_b\do_b.input"])
my_build_fun: 1 folder_b\do_b.input H:\Playground\folder_b
my_build_fun: 2 folder_b\do_b.input H:\Playground\folder_b
my_build_fun: 3 folder_b\do_b.input H:\Playground\folder_b
my_build_fun: 4 folder_b\do_b.input H:\Playground\folder_b
os.chdir('H:\\Playground')
scons: done building targets.
scons-j2的结果:尝试将chdir导入确实不存在的
\folder\u a\folder\u b

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
os.chdir('folder_a')
my_build_fun(["folder_a\do_a.output"], ["folder_a\do_a.input"])
my_build_fun: 1 folder_a\do_a.input H:\Playground\folder_a
os.chdir('folder_b')
my_build_fun(["folder_b\do_b.output"], ["folder_b\do_b.input"])
scons: *** [folder_b\do_b.output] folder_b: The system cannot find the file specified
my_build_fun: 2 folder_a\do_a.input H:\Playground\folder_a
my_build_fun: 3 folder_a\do_a.input H:\Playground\folder_a
my_build_fun: 4 folder_a\do_a.input H:\Playground\folder_a
my_build_fun
os.chdir('H:\\Playground')
scons: building terminated because of errors.

我不知道它是否是有意的,但是工作目录不是线程安全的

我曾经遇到过这个问题,解决这个问题的唯一方法是不更改目录,而是使用相对路径和/或绝对路径

SCons邮件档案中有这方面的信息,他们可能会给你更多的上下文


烤饼-users@scons.org

来自SCons手册页

警告:Python只为所有用户保留一个当前目录位置 线。这意味着使用chdir参数将不起作用 使用SCons-j选项,因为单个工作线程由 SCON在开始更改目录时相互干扰

因此,如果您的脚本无法从构建的基本目录运行。解决这个问题的(当前)最简单的方法是创建一个脚本,该脚本将cd,然后运行您的命令。甚至把它放在执行的shell命令中

env.Command(b,a,"cd ${SOURCE.dir}; do whatever -o ${TARGET.file} -i ${SOURCE.file}").