def _qsub_block(self, output_dir, error_dir, tid_specs):
processes = []<EOL>job_names = []<EOL>for (tid, spec) in tid_specs:<EOL><INDENT>job_name = "<STR_LIT>" % (self.batch_name, self.job_timestamp, tid)<EOL>job_names.append(job_name)<EOL>cmd_args = self.command(<EOL>self.command._formatter(spec),<EOL>tid, self._launchinfo)<EOL>popen_args = self._qsub_args([("<STR_LIT>",error_dir), ('<STR_LIT>',job_name), ("<STR_LIT>",output_dir)],<EOL>cmd_args)<EOL>p = subprocess.Popen(popen_args, stdout=subprocess.PIPE)<EOL>(stdout, stderr) = p.communicate()<EOL>self.debug(stdout)<EOL>if p.poll() != <NUM_LIT:0>:<EOL><INDENT>raise EnvironmentError("<STR_LIT>" % p.poll())<EOL><DEDENT>processes.append(p)<EOL><DEDENT>self.message("<STR_LIT>" % len(processes))<EOL>if (self.reduction_fn is not None) or self.dynamic:<EOL><INDENT>self._qsub_collate_and_launch(output_dir, error_dir, job_names)<EOL><DEDENT>
This method handles static argument specifiers and cases where
the dynamic specifiers cannot be queued before the arguments
are known.