ошибка cmd python: неверная команда 'y'

Python — при анализе следующих аргументов командной строки...

sys.argv = ('%s %s build_ext --inplace' % ('python', sys.argv[0]))

... для Cython внутри моего скрипта сборки "myscript_pyd_setup.py" для "myscript.pyd", который использует файл "myscript.py", я получаю следующую ошибку (e1):

ошибка python 1: неверная команда 'y'

опция командной строки python -- help не обнаружила соответствующей опции 'y'. Это имеет смысл, иначе ошибки бы не было. Поиск в SO, документации по Python и в Интернете привел к несвязанным статьям о Tkinter. Поскольку я абсолютно ничего не делаю с Tkinter, насколько мне известно, мне интересно, связана ли эта ошибка с интерпретатором командной строки python вообще?

Мои усилия:

Я пытался выполнить синтаксический анализ аргументов sys.argv.append('build_ext --inplace') для интерпретатора командной строки python при запуске «buildscript» из редактора (Komodo edit 11.x), но он также возвращается с ошибкой (e2), аналогичной версии из командной строки. или другой редактор.

ошибка python 2: неверное имя команды 'build_ext --inplace'

Запуск "myscript_pyd_setup.py" с sys.argv.append('build_ext') прекрасно создает требуемый файл *.pyd. Чего я не понимаю, так это почему он задыхается от --infile. Это работает для py2exe и pyinstaller.

Цель:

Чтобы запустить сценарий установки «myscript.py» из редактора и не переключаться туда-сюда в редакторе командной строки для компиляции *.py> *.pyd, когда я изменил код внутри «myscript.py " и хотите быстро увидеть результат.

Примечание: синтаксический анализ командной строки python myscript_pyd_setup.py build_ext --inplace работает нормально, когда sys.argv... закомментирован в "скрипте сборки"!

Третий вариант заключался в использовании cythonize в сочетании с файлами «myscript.py» и «myscript.pyd», но это показало ошибку файла копирования для «myscript.pyd». Актуально, но не для заданного выше вопроса «ошибка = y».

Любые мысли и помощь в том, как автоматизировать эту часть, чтобы предотвратить RSI, более чем приветствуются! Спасибо.

Мой пример кода "myscript.py":

import sys, time, os

#...snippet...

def print_me():
    text = "bar(man), yes, Hello, how do you do Mr. foo?"
    return text

if __name__ == '__main__':

    #...snippet...

    print_me()

Myscript_pyd_setup.py:

# myscript.py

try:
    from setuptools import setup
    from setuptools import Extension
except ImportError:
    from distutils.core import setup
    from distutils.extension import Extension

from Cython.Distutils import build_ext
#from Cython.Build import cythonize
import sys

print 'sys.argv[0] : %s' % sys.argv[0]

#sys.argv = ('%s %s build_ext --inplace' % ('python', sys.argv[0]))

sys.argv.append('build_ext --inplace')

ext_modules = [Extension("myscript",['myscript.py'])]
#ext_modules = cythonize("myscript.py")

#setup: "name" and "cmdclass" are commented-out when using cythonize.

setup(
    name= 'XYZ model class',
    cmdclass = {'build_ext': build_ext},
    include_dirs = [],
    ext_modules = ext_modules)

person ZF007    schedule 02.02.2018    source источник


Ответы (1)


sys.argv — это список аргументов. Когда вы добавляете 'build_ext --inplace', вы буквально добавляете это как один аргумент (как если бы вы передали его в кавычках из командной строки оболочки). Так произошло и во втором случае.

В первом вы присвоили строку обратно sys.argv. Но строка также является последовательностью, поэтому ваши команды выполнялись так, как если бы они вызывались с помощью (argv[1:]): ['y', 't', `h`, ...]

В любом случае вы получили опцию/подкоманду, неизвестную парсеру аргументов.

person Ondrej K.    schedule 05.02.2018
comment
Если я вас правильно понял, это должна быть команда sys.argv.append('build', '--inplace')? Потому что, если за его первым 'build' следует второе добавление '--inplace', первая команда будет выполнена без последнего... - person ZF007; 05.02.2018
comment
На самом деле: sys.argv.append('build'); sys.argv.append('--inplace') или sys.argv.extend(('build', '--inplace')). sys.argv.append('build', '--inplace') вообще не будет работать, потому что метод append принимает один аргумент и добавляет один элемент. - person Ondrej K.; 05.02.2018
comment
Общий комментарий. Я надеюсь, что они окажутся полезными, чтобы помочь вам продвинуться, но это только решает вашу насущную проблему. Я не слишком в восторге от манипуляции с sys.argv, поскольку это глобальный атрибут работающей среды, и это нарушает инкапсуляцию интерфейса/объекта (это неаккуратно и может вызвать проблемы в будущем). К сожалению, я недостаточно знаком с distutils, чтобы дать вам правильный ответ, но я бы посоветовал вам осмотреться и посмотреть, как передать собственный набор аргументов вместо использования sys.argv (например, argparse позволяет то же самое). - person Ondrej K.; 05.02.2018
comment
Спасибо за это ... Я посмотрю на это. Когда у меня это будет покрыто, я дам вам знать, как я решил это. - person ZF007; 05.02.2018