Вывод к командной строке, если запущено с командной строки

Конструкция Python if / else не работает векторизованно с Pandas / NumPy. Здесь вы можете использовать np.where для операций со столбцами:

# CORRECT
df['cross'] = np.where(df['CO'], 'cross', None)

# INCORRECT
# df['cross'] = df.apply(lambda x: 'cross' if (df['CO'] is True) else None, axis=1)

Если вы заинтересованы в цикле по строкам, это возможно, но неэффективно :

[111 ]
6
задан Yes - that Jake. 3 December 2008 в 22:16
поделиться

2 ответа

Обновление 1:

Как сказано в ответе Michael Burr, Raymond Chen недавно отправил короткую статью об этом. Я рад видеть, что мое предположение не было полностью неправильным.

Обновление 0:

Отказ от ответственности: Этот "ответ" является главным образом предположением. Я отправляю его только потому, что достаточно времени передало, чтобы установить, что не у многих людей есть ответ на то, что похоже на фундаментальный вопрос.

Я думаю, что "решение", если приложение является gui или консолью, принято во время компиляции а не во времени выполнения. Таким образом, если Вы компилируете свое приложение как gui приложение, даже если Вы не отображаете gui, все еще gui приложение, и не имеет консоли. Если Вы примете решение скомпилировать его как консольное приложение затем в минимуме, то у Вас будут консоли, высвечивающиеся прежде, чем переместиться в gui "режим". И я не знаю, возможно ли это в управляемом коде.

Проблема фундаментальна, я думаю, поскольку консольное приложение должно взять на себя "управление" консольного приложения вызова. И это должно сделать так, прежде чем код дочернего приложения работает.

2
ответ дан 8 December 2019 в 18:43
поделиться

Raymond Chen недавно отправил (спустя месяц после того, как вопрос был отправлен здесь на ТАК), короткая статья об этом:

Как я пишу программу, которая может быть запущена или как консоль или как приложение GUI?

Вы не можете, но можно попытаться фальсифицировать его.

Каждое приложение PE содержит поле в своем заголовке, который указывает, под какой подсистемой оно было разработано для выполнения. Можно сказать IMAGE_SUBSYSTEM_WINDOWS_GUI для маркировки себя как приложение Windows GUI, или можно сказать IMAGE_SUBSYSTEM_WINDOWS_CUI сказать, что Вы - консольное приложение. Если Вы будете приложением GUI, то программа будет работать без консоли.

Подсистема определяет, как ядро готовит среду выполнения к программе. Если программа будет отмечена как работающий в консольной подсистеме, то ядро подключит консоль программы к консоли ее родителя, создавая новую консоль, если родитель не будет иметь консоли. (Это - неполное описание, но детали не относятся к обсуждению.), С другой стороны, если программа будет отмечена столь же под управлением как приложение GUI, то ядро запустит программу без любой консоли вообще.

В той статье он указывает другому Junfeng Zhang, который обсуждает, как несколько программ (Visual Studio и ildasm) реализуют это поведение:

Как подать заявку и как GUI и как Консольное приложение?

В случае VisualStudio существует на самом деле два двоичных файла: devenv.com и devenv.exe. Devenv.com является Консольным приложением. Devenv.exe является приложением для GUI. При вводе devenv, из-за правила зондирования Win32, devenv.com выполняется. Если нет никакого входа, devenv.com запускает devenv.exe и выходит из себя. Если существуют исходные данные, devenv.com обрабатывает их как нормальное Консольное приложение.

В ildasm случае существует только один двоичный файл: ildasm.exe. Это сначала компилируется как приложение GUI. Более поздний editbin.exe используется для маркировки его как консольную подсистему. В его основном методе это определяет, должно ли это быть выполнено как режим GUI или консольный режим. Если потребность работать как режим GUI, это повторно запускает себя как приложение для GUI.

В комментариях к статье Raymond Chen laonianren имеет это для добавления к краткому описанию Junfeng Zhang того, как Visual Studio работает:

devenv.com является приложением тупика консольного режима общего назначения. Когда это работает, это создает три канала для перенаправления stdin консоли, stdout и stderr. Это затем находит свое собственное имя (обычно devenv.com), заменяет ".com" ".exe" и запускает новое приложение (т.е. devenv.exe) использование конца чтения канала stdin и концов записи stdout и каналов stderr как стандартные дескрипторы. Затем это просто сидит и ждет devenv.exe для выхода и данные копий между консолью и каналами.

Таким образом даже при том, что devenv.exe является gui приложением, оно может считать и записать "родительскую" консоль с помощью своих стандартных дескрипторов.

И Вы могли использовать devenv.com сами для myapp.exe путем переименования его на myapp.com. Но Вы не можете в практике, потому что она принадлежит MS.

11
ответ дан 8 December 2019 в 18:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: