Python sys.argv[1:] не принимает параметры командной строки
Обновление / Решение: ответ ниже, от Зака. Проблема, действительно, заключалась в конце строки 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.
Кроме того, как было запрошено в комментариях, файл конфигурации (который содержит справочное сообщение и допустимые параметры / аргументы, находится ЗДЕСЬ
Обновить
После долгих потрясений лучшим достижением, которое я достиг, было изучение параметров и аргументов метода (main). Самым удивительным было то, что при передаче аргумента и последующем анализе его результата print sys.argv
опцион придет с трейлингом \r
в этом. Например:
clenotes.cmd appointments
args is ['appointments\r']
На Windows я сделал то же самое, и args было сообщено как ['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 ответа
Я думаю, что ваша проблема в том, что 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 - прокрутите вниз до абзаца, который начинается "В дополнение к стандартному fopen()
режимы... ".
(Или вы можете запустить эту команду: perl -pi.bak -e 's/[ \t\r]+$// clenotes.cfg
- это преобразует его в конец строки Unix. На твоем месте я бы, наверное, сделал и то и другое.)
(Если ни одно из приведенных выше предложений не поможет, то я попробую нажать clenotes.py
сам с вышеупомянутой командой perl. Я не понимаю, как это может быть проблемой, но если \r
персонажи не приходят из clenotes.cfg
, .py
файл является единственным вероятным оставшимся источником.)
(РЕДАКТИРОВАТЬ: Основываясь на ваших комментариях к самому вопросу, теперь я думаю, что это clenotes.cmd
- оболочка сценария оболочки, которую нужно конвертировать из DOS в окончания строк Unix.)
Мне придется продолжать искать, откуда это исходит. Но тем временем эта проблема стала намного проще. После того, как аргументы проанализированы, сделайте это:
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 - однако учтите, что разбор здесь гарантирует, что другим людям не придется снова решать ту же проблему. (С другой стороны, это немного некрасиво или, по крайней мере, загадочно для людей, не ожидающих таких проблем.)