Попытка запустить скрипт python из командного файла без всплывающего окна cmd - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь создать программу, которая берет ваш выделенный текст, а затем инвертирует регистр, используя скрипт python. Логика c по сути: получить выделенный текст в буфер обмена, выполнить преобразование, затем вернуть текст в буфер обмена и вставить его.

Я пытаюсь выполнить это, создав командный файл, который запускается из горячая клавиша AutoHotKey, но дело в том, что командный файл должен запускаться без всплывающего окна cmd, потому что тогда он меняет фокус окна и не может правильно получить выделенный текст.

Код работает, когда я запускаю его внутри PyCharm, и я могу заставить файл запускаться с помощью горячей клавиши, но окно все еще появляется очень быстро, что разрушает процесс.

Курс I Я сказал, что в пакетном файле нужно поставить @pyw вместо @py at для запуска python без окон, но окно все равно всплывает очень быстро. Кажется, я не могу найти решение, которое работает.

Я пытался запустить его через файл .vbs, но это не сработало так, как я хотел. Я проверил, чтобы убедиться, что pythonw.exe работает, и это так. Я попытался изменить имя файла на .pyw в коде пакета.

Что я делаю не так? Это с моим python кодом или кодом партии? Я не знаю.

Мой пакетный код:

@pyw "C:\Users\offic\PycharmProjects\test\automate the boring stuff\projects\change case of selected.pyw" %*

Мой Python Код:

#! python 3

import pyperclip
import pyautogui as pya
import time
import sys

#mystery code I tried to make work as a solution
# import ctypes
# import os
# import pywin32_system32
#
# hwnd = ctypes.windll.kernel32.GetConsoleWindow()
# if hwnd != 0:
#     ctypes.windll.user32.ShowWindow(hwnd, 0)
#     ctypes.windll.kernel32.CloseHandle(hwnd)
#     _, pid = pywin32.GetWindowThreadProcessId(hwnd)
#     os.system('taskkill /PID ' + str(pid) + ' /f')


def copy_clipboard():
    pyperclip.copy("")  # <- This prevents last copy replacing current copy of null.
    pya.hotkey('ctrl', 'c')
    time.sleep(.01)  # ctrl-c is usually very fast but your program may execute faster
    return pyperclip.paste()


clipboard = copy_clipboard()

try: #check if there is an argument
    # convert clipboard to uppercase if arg is 'u'
    if sys.argv[1] is 'u': 
        pyperclip.copy(clipboard.upper())
    # convert clipboard to lowercase if arg is 'l'
    elif sys.argv[1] is 'l':
        pyperclip.copy(clipboard.lower())
    #else just swap the case of every character if the arg is not u or l
    else:
        pyperclip.copy(clipboard.swapcase())

#if there are no args just swap the case of every charater
except:
    # put swapped string to clipboard
    pyperclip.copy(clipboard.swapcase())

pya.hotkey('ctrl', 'v')

# hELLO

Мой код AutoHotKey (если это как-то важно):

^+q::
Run, "C:\Users\offic\Documents\MY BATCH FILES\swapcase.bat"
return

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вы можете запустить скрипт Python (с расширением .pyw) из AHK:

Run script.pyw, c:\mydir  

c:\mydir - это местоположение скрипта Python. Это будет работать, если Python, конечно, связано с расширением .pyw.

1 голос
/ 14 апреля 2020
^+q::
Run, "C:\Users\offic\Documents\MY BATCH FILES\swapcase.bat",, Hide
return

AutoHotkey Запуск Параметры: Скрыть .

Это будет запуск swapcase.bat, вызывающий отображение окна консоли. Сомневаюсь, что pyw работает pythonw.exe, поскольку оба являются графическими пользовательскими интерфейсами (GUI) вместо консольного пользовательского интерфейса (CUI), которым является cmd.exe, поскольку он интерпретирует swapcase.bat.

...