Skip to content

Commit 02e6eb7

Browse files
committed
Closes #1605, again
1 parent d0131ea commit 02e6eb7

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

src/Core/Python/PythonInterpreter.cc

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,34 @@ namespace
439439
std::transform(wideArgv.begin(), wideArgv.end(), wideArgvPtrs.begin(), [](std::vector<wchar_t>& wide) { return &wide[0]; });
440440
return wideArgvPtrs;
441441
}
442+
443+
std::vector<wchar_t> getProgramName(const std::vector<std::string>& argv)
444+
{
445+
size_t name_len = argv[0].size();
446+
std::vector<wchar_t> program_name(name_len + 1);
447+
mbstowcs(&program_name[0], argv[0].c_str(), name_len + 1);
448+
return program_name;
449+
}
450+
451+
void setPythonArgv(const std::vector<std::string>& argv)
452+
{
453+
auto wideArgv = wideArgvFromArgv(argv);
454+
auto wideArgvPtrs = wideArgvPtrsFromWideArgv(wideArgv);
455+
456+
int argsOffset = 0;
457+
auto scriptFlag1 = std::find(argv.begin(), argv.end(), "-s");
458+
auto scriptFlag2 = std::find(argv.begin(), argv.end(), "--script");
459+
if (scriptFlag1 != argv.end())
460+
{
461+
argsOffset = scriptFlag1 - argv.begin() + 1;
462+
}
463+
else if (scriptFlag2 != argv.end())
464+
{
465+
argsOffset = scriptFlag2 - argv.begin() + 1;
466+
}
467+
468+
PySys_SetArgv(wideArgvPtrs.size() - argsOffset, &wideArgvPtrs[argsOffset]);
469+
}
442470
}
443471

444472
void PythonInterpreter::initialize(bool needProgramName, const std::string& commandLine, const boost::filesystem::path& libPath)
@@ -447,22 +475,14 @@ void PythonInterpreter::initialize(bool needProgramName, const std::string& comm
447475

448476
if (needProgramName)
449477
{
450-
size_t name_len = argv[0].size();
451-
std::vector<wchar_t> program_name(name_len + 1);
452-
mbstowcs(&program_name[0], argv[0].c_str(), name_len + 1);
453-
454-
//std::cerr << "Initializing Python ..." << std::endl;
455-
this->private_->setProgramName(program_name);
478+
this->private_->setProgramName(getProgramName(argv));
456479
// TODO: remove debug print when confident python initialization is stable
457480
//std::wcerr << "initialize program name=" << this->private_->programName() << std::endl;
458481
}
459482

460483
initialize_eventhandler(needsSpecialPythonPathTreatment(commandLine), libPath);
461484

462-
auto wideArgv = wideArgvFromArgv(argv);
463-
auto wideArgvPtrs = wideArgvPtrsFromWideArgv(wideArgv);
464-
465-
PySys_SetArgv(argv.size(), &wideArgvPtrs[0]);
485+
setPythonArgv(argv);
466486

467487
{
468488
auto out = [](const std::string& s)

0 commit comments

Comments
 (0)