2013-09-11 2 views
0

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

То, что я пытаюсь сделать, заключается в запуске скрипта python в скрипте python, передающем некоторые аргументы.

до сих пор, я не сделал это, используя файл битой, как это:

test.bat

... 
SET fileName='c:\works\files\file.xml' 
SET url='someurl' 
SET table='tablename' 
c:\Python27\python.exe "C:\Program Files (x86)\Google\google_appengine\appcfg.py" upload_data --config_file=C:\works\config.yaml --filename="%fileName%" --url="%url%" --kind="%table%" 

это прекрасно работает. Теперь мне нужно вызвать этот сценарий в другом питон скрипт, например:

test.py

... 
fileName = 'c:\works\files\file.xml' 
url = 'someurl' 
table = 'tablename' 
if(os.path.exists(fileName): 
    print 'exists!' 
    #launch appcfg.py here!! 
else: 
    print 'file missing' 

файл правильно найден, 'exists! сообщение правильно показано, но я не знаю, как вызвать этот файл python сейчас .. Я пробовал эти две команды, но они не работают (может быть, это пробел на пути? Я не знаю, как это сделать).

первая попытка: сбой

os.system('c:\Python27\python.exe "C:\Program Files (x86)\Google\google_appengine\appcfg.py" upload_data --config_file=C:\works\config.yaml --filename='+fileName+' --url='+url+' --kind='+table) 

вторая попытка: двойной провал

subprocess.call(['c:\Python27\python.exe','"C:\Program Files (x86)\Google\google_appengine\appcfg.py" upload_data --config_file=C:\works\config.yaml --filename='+fileName+' --url='+url+' --kind='+table ]) 

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

Я в ваших руках, спасибо заранее, с наилучшими пожеланиями

+0

* UPDATE * Я исправил эти ошибки копирования вставки, которые @Kindall указывал – BeNdErR

ответ

1

Причиной отказа первой попытки очевидна:

os.system('c:\Python27\python.exe "C:\Program Files (x86)\Google\google_appengine\appcfg.py" upload_data --config_file=C:\works\config.yaml --filename='+fileName+' --url='+url+' --kind='+table+') 

Это ошибка синтаксиса; у вас есть дополнительный знак + и апостроф перед закрывающей круглой скобкой. Другими словами, эта линия должна заканчиваться:

... +table) 

reoson для отказа вашей второй попытки является столь же очевидно:

subprocess.call(['c:\Python27\python.exe','"C:\Program Files (x86)\Google\google_appengine\appcfg.py" upload_data --config_file=C:\works\config.yaml --filename='+fileName+' --url='+url+' --kind='+table+' ]) 

Это та же проблема, как ваш первый, плюс вы не смогли сломать добавьте отдельные аргументы в команду в отдельные элементы списка, как требуется subprocess.call(). Вам также не нужны двойные кавычки вокруг аргументов, которые содержат пробелы (это подсказки для оболочки относительно аргумента, это не нужно здесь, так как оболочка не будет обрабатывать это, и вы уже разделили аргументы).Другими словами, он должен больше походить на:

subprocess.call(['c:\Python27\python.exe','C:\Program Files (x86)\Google\google_appengine\appcfg.py', 'upload_data', '--config_file=C:\works\config.yaml', '--filename='+fileName, '--url='+url, '--kind='+table]) 

Теперь у вас все еще есть проблема ... обратная косая черта. Обратная косая черта - это символ escape в строковых литералах Python, в результате чего следующий символ имеет особое значение. Большинство обратных косых черт в ваших строках не предшествуют символу с каким-либо особым значением, поэтому они не вызовут никаких проблем ... однако есть \a, который преобразуется в ASCII BEL (который подает звуковой сигнал о терминале).

Существует три подхода к работе с обратными косыми чертами, которые необходимо использовать в любое время использовать слеш строкового литерала:

  • Двойных все ваши обратные косые черты. Python интерпретирует две обратные косые черты как единую обратную косую черту, а следующий символ не имеет особого значения.
  • Использовать необработанные строковые литералы, предшествующие строковому литералу с помощью r. Это приводит к тому, что обратная косая черта теряет свое особое значение (ну, sorta, она не работает так, как вы ожидаете, если обратная косая черта - последняя вещь в строке).
  • Для имен путей Windows просто используйте косые черты вместо обратных косых черт. Windows довольна либо!

Использование третьего варианта здесь мы имеем:

subprocess.call(['c:/Python27/python.exe','C:/Program Files (x86)/Google/google_appengine/appcfg.py', 'upload_data', '--config_file=C:/works/config.yaml', '--filename='+fileName, '--url='+url, '--kind='+table]) 

Запуск другой процесс Python является своего рода супертяжелом способ сделать что-то вроде этого; может быть лучший способ, например, import скрипт и вызов его метода main().

+0

whops, that + был ошибкой копирования. Я попробую последнее решение прямо сейчас! – BeNdErR

+0

сначала, спасибо. Я получаю эту ошибку: * c: \ Python27 \ python.exe: невозможно открыть файл '' C: \ Program Files \ Google \ google_appengineppcfy.py "': [Errno 22] Недопустимый аргумент * .. Это похоже на \ a на пути магически здорова или интерпретируется. – BeNdErR

+1

О да, '\ a' - побег для ASCII 7 (звонок). Я посмотрел, не вызовет ли обратная косая проблема, но пропустил это. Я добавил раздел о работе с обратными косыми чертами. – kindall

0

Я бы попробовать делать somehting как это.

os.system("appcfg.py arg1 arg2 arg3") 

Я хотел бы посмотреть на эту часть документации os.

Goodluck.

+0

и все другие аргументы? – BeNdErR

+0

@BeNdErR просто добавьте их, обновленный ответ. – myusuf3

1

Почему вы не импортируете другой скрипт python? Затем вы можете передать правильные аргументы в свою основную функцию.

Редактировать: Вот appcfg.py's source. Это поможет вам найти нужную вам функцию.

Edit 2: Вот код, чтобы помочь:

import appcfg 
appcfg_globals = dict([(var, eval('appcfg.' + var))for var in dir(appcfg)]) 
# Insert arguments into appcfg_globals 
appcfg.run_file_(appcfg.__file__, appcfg_globals) 

Как это работает: реж (модуль) перечисляются все переменные в 'модуле' как так:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', [...]] 

Но мы хотим получить диктовку формы:

{ 
'__builtins__': {[...]}, 
'__doc__': [...], 
'__file__': 'C:\Program Files (x86)\Google\google_appengine\appcfg.py', 
'__name__': 'appcfg', 
'__package__': [...], 
[...] 
} 

Итак, мы ge t значения, связанные с именами, использующими eval, и сопоставить их там с именем в кортеже, подобном этому: (variable_name, variable_value). dict() делает все остальное!

Все, что осталось сделать, это вставить аргументы. Я позволю тебе найти это по своему усмотрению!

Доказательство это работает:

my_test.ру:

my_globals = globals() 

В Python:

>>> import my_test 
>>> my_test.my_globals == dict([(var, eval('my_test.' + var))for var in dir(my_test)]) 
True 
+0

Можете ли вы объяснить мне, как? Я питон newbye. Вам нужен код appcfg.py? Это от appengine sdk, от Google. могу ли я его предоставить? – BeNdErR

+1

Я добавил ссылку на источник, чтобы вы могли увидеть, как выполнить appcfg.py – ThinkChaos

+0

uhm .. Я действительно не знаю, как вызвать это внутри моего скрипта .. __file__ - массив аргументов? – BeNdErR

Смежные вопросы