2013-08-30 5 views
0

Так у меня есть код питона, названный сказать program1.pyВызов кода Python через другой код Python

Чтобы выполнить это нормально я следующий

python program1.py -i input.dat -o output.dat 

-i indicates what follows is an input file (in this case input.dat) 
-o indicates the name of the output file to be written (in this case output.dat) 

Я попытался назвать программу (program1 .py) внутри другого питонного кода:

os.system('/sw/bin/python2.7 program1.py -i Users/Steve/Desktop/{} -o Users/Steve/Desktop/{}'.format(inputFile),.format(outputFile)) 

Это не работает. Я знаю, что мне нужно использовать команду ОС, но точный способ форматирования для «-i» и «-o» вызывает недоумение.

Может ли кто-нибудь показать мне, что я делаю неправильно?

+0

является «Пользователем/Стивом/Рабочий стол» опечатка? Вы имели в виду поставить это в корневой каталог? '/ Пользователи/...? – Erik

ответ

4

Реальная проблема в вашем коде является то, что вы не используете format правильно. На самом деле, как написано, он не будет даже скомпилировать:

os.system('/sw/bin/python2.7 program1.py -i Users/Steve/Desktop/{} -o Users/Steve/Desktop/{}'.format(inputFile),.format(outputFile)) 

Для первого аргумента system, вы пытаетесь форматировать строку с двумя заполнителями и только кормить его одно значение. Затем для второго аргумента вы передаете .format(outputFile), что является ошибкой.

Вы можете исправить все, что написав:

os.system('/sw/bin/python2.7 program1.py -i Users/Steve/Desktop/{} -o Users/Steve/Desktop/{}'.format(inputFile, outputFile)) 

Однако, это плохой способ делать вещи. Обычно вы можете просто перезаписать свой код, чтобы импортировать функциональность в свой скрипт и вызвать его. Если единственная причина, по которой вы этого не делаете, заключается в том, чтобы заставить дочерний процесс, multiprocessing по-прежнему обычно является лучшим способом сделать это.


Но иногда вам нужно что-то делать. В этом случае вы все равно не должны использовать os.system. Во-первых, чтобы запустить новый скрипт с использованием того же интерпретатора, что и ваш скрипт, используйте sys.executable, а не hardcoding. Во-вторых, как сообщит вам документ или помощь os.system, вы должны почти всегда использовать функции в subprocess. Итак:

subprocess.call([sys.executable, 'program1.py', 
       '-i', 'Users/Steve/Desktop/{}'.format(inputfile), 
       '-o', 'Users/Steve/Desktop/{}'.format(outputfile)]) 

Это берет на себя все виды проблем для вас, например, вы не должны выяснить, как процитировать имена файлов в случае, если они имеют пробелы, и это более безопасно и эффективно, чтобы не использовать если вам это не нужно.


Однако это еще вероятно, не будет работать для вас, если ваш текущий рабочий каталог не случается '/'. Если вы хотите использовать абсолютный путь, вы должны запустить его с /.

В то время как мы на нем, обычно лучше использовать функции пути вместо строковых функций для обработки путей, как в os.path.join('/Users/Steve/Desktop', inputfile).


Еще лучше, вы можете захотеть найти рабочий стол текущего пользователя вместо жесткого кодирования этого пути.Как рекомендует Apple, для этого требуется установить pyobjc (который встроен в установку Apple Python, но, вероятно, не использует установку Fink, которую вы используете). Но тогда это так же просто, как:

desktop = AppKit.NSSearchPathForDirectoriesInDomains(AppKit.NSDesktopDirectory, 
                AppKit.NSUserDomainMask, 
                True)[0] 
4

Я думаю, вы должны импортировать модуль program1 в ваш filename.py и использование program1 функции на нем

+2

Это, вероятно, правильный ответ, но вы должны это разъяснить. Я чувствую, что @SteveGrafton не знает о 'import' (или что у него странная причина для его игнорирования). –

+0

возможно. Или он ищет жесткие пути или альтернативу импорту –