Python sys.argv [1:] не принимает параметры командной строки - PullRequest
4 голосов
/ 04 февраля 2011

Обновление / Решение: ответ ниже, от Зак .Проблема, действительно, заключалась в конце строки DOS в самом файле скрипта, clenotes.cmd.Так как я много занимался различными файлами, я удалил весь каталог, а затем заново загрузил свежую копию из ЗДЕСЬ .Я запустил perl-скрипт Zack'а для файла следующим образом:

perl -pi.bak -e 's/[ \t\r]+$//' clenotes.cmd

Затем я слегка отредактировал выполнение команды так, чтобы окончательный сценарий стал:

CWD=`dirname $0`
JYTHON_HOME="$CWD"
LIB_DIR="$JYTHON_HOME/lib"
NOTES_HOME="/opt/ibm/lotus/notes/"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NOTES_HOME
java -cp "$LIB_DIR" -jar "$LIB_DIR/jython.jar" -Djython.home="$CWD/" -Dpython.path="$LIB_DIR:$CWD/ext" -Djava.library.path="$NOTES_HOME" "$LIB_DIR/clenotes/cletes/clenotes.py" "$@"

Вот и все -все остальное работало.Никаких правок, необходимых для clenotes.py или clenotes.cfg, не требуется.Большое спасибо за то, что остались с вопросом, который, как мне кажется, оказался довольно простым.


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


Я пытаюсь заставить командную строку Lotus Notes работать на Linux и у меня возникла проблема с чем-то связанным с sys.argv [1:] в файле Python.Сценарий Windows находится здесь:

@echo off
@setlocal 
set CWD=%~dp0
set JYTHON_HOME=%CWD%
set LIB_DIR=%JYTHON_HOME%/lib
java -cp %LIB_DIR% -jar %LIB_DIR%/jython.jar -Djython.home=%CWD%  -python.path=%LIB_DIR%;%CWD%/ext %LIB_DIR%/clenotes/clenotes.py  %*

@endlocal

Мне было тяжело с переменными, поэтому для Linux это выглядит просто так:

java -cp ./lib/ -jar ./lib/jython.jar -Djython.home=./ -Dpython.path=./lib:./ext -Djava.library.path=/opt/ibm/lotus/notes/ ./lib/clenotes/clenotes.py $*

Я запускаю его из каталога,В любом случае, меня озадачивает то, что он не выбирает какие-либо параметры, которые я передаю из командной строки.clenotes.cmd --help приводит к

No commands specified. Use --help option for usage.

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

def main():    

  Output.log("Entering %s v%s" % (PROGRAM_NAME,VERSION),Output.LOGTYPE_DEBUG)
  cliOptions2=[]
  for opt in cliOptions:
    opt2=opt.replace('--','')
    opt2=opt2.replace('!','=')
    cliOptions2.append(opt2)
  opts=[]
  args=[]
  try:
    opts, args = getopt.getopt(sys.argv[1:], '', cliOptions2)

Я использую Python 3.1.3 в Arch Linux 64bitв 32-битной среде chroot.Могу ли я предоставить что-нибудь еще?

На всякий случай, если это необходимо ... ЗДЕСЬ - это весь файл clenotes.py.

Кроме того, как было запрошено в комментариях,Конфигурационный файл (который содержит справочное сообщение и возможные параметры / аргументы, ЗДЕСЬ


Обновление

После долгих хлопот,Наилучший прогресс, который я достиг, - это проверить, что он устанавливает как opts и args в (main) методе. Самым удивительным было то, что при передаче аргумента и последующем просмотре его проанализированного результата с использованием print sys.argv, опция получитв нем тянется \r. Например:

clenotes.cmd appointments
args is ['appointments\r']

В Windows я сделал то же самое, и аргументы были указаны как ['appointments']. Кроме того, вручную установил args=['appointments'], а затем закомментировал раздел, где getopt.getopt присваивает сработавшее значение.

Наконец, я обнаружил, что при использовании нескольких аргументов n-1 из них интерпретируется и используется, а n-й игнорируется. Это вид обходной путь, так как я могуиспользовать сценарий ... но, очевидно, это не является предпочтительным.Если я хочу посмотреть на сегодняшние встречи, я могу выполнить clenotes.cmd appointments --today --today, и это сработает.sys.argv выплюнет: ['appointments', '--today', '--today\r'].

Итак ... что вызывает трейлинг \r?Я думаю, что это связано с реальным сценарием.Запомните еще раз:

java -cp ./lib/ -jar ./lib/jython.jar -Djython.home=./ -Dpython.path=./lib:./ext -Djava.library.path=/opt/ibm/lotus/notes/ ./lib/clenotes/clenotes.py $*

Итак ... куча путей, а затем фактический файл python: clenotes.py $*

Я получил $* от ЗДЕСЬ

Это забирает возврат каретки ??

Ответы [ 2 ]

5 голосов
/ 05 февраля 2011

Я думаю, что ваша проблема в том, что clenotes.cfg имеет окончания строки DOS, что Python неправильно интерпретирует.Попробуйте изменить эту строку на clenotes.py

config.readfp(open('%sconfig/clenotes.cfg' % System.getProperty('jython.home')))

следующим образом:

config.readfp(open('%sconfig/clenotes.cfg' % System.getProperty('jython.home'), "rU"))

"rU" сообщает Python, что, несмотря на то, что он работает в системе Unix, он должен быть готов справиться сфайл, содержащий окончания строки DOS.См. http://docs.python.org/library/functions.html#open - прокрутите вниз до абзаца, который начинается «В дополнение к стандартным fopen() режимам ...».

(Или вы можете выполнить эту команду: perl -pi.bak -e 's/[ \t\r]+$// clenotes.cfg -это преобразует его в окончания строки Unix. На вашем месте я бы, вероятно, сделал бы оба .)

(Если ни один из вышеперечисленных предложений не поможет, то следующее, что я бы попробовал, это нажать clenotes.py сам по себе с помощью приведенной выше команды perl. Я не понимаю, как это может быть проблемой, но если символы *1021* не из clenotes.cfg, файл .py является единственно вероятнымоставшийся источник.)

(РЕДАКТИРОВАТЬ: Основываясь на ваших комментариях к самому вопросу, теперь я думаю, что это clenotes.cmd, оболочка сценария оболочки, которую нужно преобразовать из DOS в окончания строк Unix.)

3 голосов
/ 05 февраля 2011

Мне придется искать, откуда это исходит. Но тем временем эта проблема стала намного проще. После анализа аргументов сделайте следующее:

args = [arg.strip() for arg in args]

Это избавит от \r

РЕДАКТИРОВАТЬ: Но подождите - это только частичное решение? Это все еще не правильно разбирает опции?

EDIT2: похоже, что \r нужно удалить раньше. Когда нет команды, /r никогда не удаляется, потому что вышеприведенные операции удаляют только \r после выполнения getopt. Это должно было быть очевидно для меня раньше - вместо передачи sys.argv[1:] здесь

opts, args = getopt.getopt(sys.argv[1:], '', cliOptions2)

сначала измените его

argv = [arg.strip() for arg in sys.argv[1:]]
opts, args = getopt.getopt(argv, '', cliOptions2)

Вы могли бы также просто сделать sys.argv[-1] = sys.argv[-1].strip() ... но программист во мне начинает чувствовать тошноту, глядя на это. Наверное, иррационально, я знаю.

Или просто сделайте то, что сказал Зак, и конвертируйте clenotes.cmd в формат linux - однако, обратите внимание, что разбор здесь гарантирует, что другим людям не придется снова решать ту же проблему. (С другой стороны, это немного некрасиво или, по крайней мере, загадочно для людей, не ожидающих таких проблем.)

...