views:

55

answers:

1

Hello.

I want to copy an installer file from a location where one of the folder names changes as per the build number

This works for defining the path where the last folder name changes

 import glob
 import os
 dirname = "z:\\zzinstall\\*.install"
 filespec = "setup.exe"
 print glob.glob (os.path.join (dirname, filespec))
 # the print is how I'm verifying the path is correct
 ['z:\\zzinstall\\35115.install\\setup.exe'

The problem I have is that I can't get the setup.exe to launch due to the arguments needed

I need to launch setup.exe with, for example

setup.exe /S /z"

There are numerous other arguments that need to be passed with double quotes, slashes and whitespaces. Due to the documentation provided which is inconsistent, I have to test via trial and error. There are even instances that state I need to use a "" after a switch!

So how can I do this?

Ideally I'd like to pass the entrire path, including the file I need to glob or

I'd like to declare the result of the path with glob as a variable then concatenate with setup.exe and the arguements. That did not work, the error list can't be combined with string is returned. Basically anything that works, so far I've failed because of my inability to handle the filename that varies and the obscene amount of whitespaces and special characters in the arguements.

The following link is related howevers does not include a clear answer for my specific question link text

The response provided below does not answer the question nor does the link I provided, that's why I'm asking this question. I will rephrase in case I'm not understood.

I have a file that I need to copy at random times. The file is prependedned with unique, unpredicatable number e.g. a build number. Note this is a windows system. For this example I will cite the same folder/file structure.

The build server creates a build any time in a 4 hour range. The path to the build server folder is Z:\data\builds*.install\setup.exe

Note the wildcard in the path. This means the folder name is prepended with a random(yes, random) string of 8 digits then a dot. then "install". So, the path at one time may be Z:\data\builds\12345678.install\setup.exe or it could be Z:\data\builds\66666666.install\setup.exe This is one, major portion of this problem. Note, I did not design this build numbering system. I've never seen anything like this my years as a QA engineer. So to deal with the first issue I plan on using a glob.

import glob 
import os
dirname = "Z:\\data\\builds\\*.install" 
filespec = "setup.exe"
instlpath = glob.glob (os.path.join (dirname, filespec))
print instlpath # this is the test,printsthe accurate path to launch an install, problem #is I have to add arguements

OK so I thought I could use path that I defined as instlpath, concatnenate it and execute.

when it try and use prinnt to test

print instlpath + [" /S /z" ]

I get ['Z:\builds\install\12343333.install\setup.exe', ' /S /z']

I need Z:\builds\install\12343333.install\setup.exe /S /z" #yes, I need the whitespace as #well and amy also need a z""

Why are all of the installs called setup.exe and not uniquely named? No freaking idea!

Thank You,

Surfdork

A: 

The related question you linked to does contain a relatively clear answer to your problem:

import subprocess
subprocess.call(['z:/zzinstall/35115.install/setup.exe', '/S', '/z', ''])

So you don't need to concatenate the path of setup.exe and its arguments. The arguments you specify in the list are passed directly to the program and not processed by the shell. For an empty string, which would be "" in a shell command, use an empty python string.

See also http://docs.python.org/library/subprocess.html#subprocess.call

Bernd Petersohn
import glob import osimport subprocess dirname = "C:\\sikuli\\*.SRinstall" filespec = "setup.exe"instlpath = glob.glob (os.path.join (dirname, filespec))subprocess.call (instlpath[0] + ' /S /z"')
surfdork