Gisle Vanem gva...@yahoo.no wrote:
Regrading handy uses of ''', you learned me one trick when using Pythonÿ
code in a Windows .bat file:
rem = '''
@echo off
echo This is batch
\python32\python %0
echo All done
exit /b
rem '''
import sys
print(This is Python)
for i,p in enumerate(sys.path):
print('sys.path[%2d]: %s' % (i, p))
print(Python done)
You'll have a variable in Python called 'rem' which contains all
your
batch code :) It exploits the fact that 'rem' makes a
one-line
comment, but the triple quotes go across multiple lines.
A better trick would be to use a Powershell script instead of a batch
file:
---
filter python() { $_ | c:\Python33\python.exe ($args -replace'(\\*)','$1$1\')
}
Write-Host This is the powershell script
dir cert: | convertto-json | python -c @
import json, sys
stores = json.loads(sys.stdin.read())
print(This is Python)
for store in stores:
print({}: {}.format(store['PSChildName'], ', '.join(store['StoreNames'])))
print(Python done)
@
Write-Host All done
---
C:\scripts . .\Pythoncerts.ps1
This is the powershell script
This is Python
CurrentUser: Root, UserDS, Disallowed, Trust, My, TrustedPublisher,
SmartCardRoot, TrustedPeople, ADDRESSBOOK, AuthRoot,
McAfee Trust, CA, REQUEST, ACRS
LocalMachine: Disallowed, Trust, CA, TrustedPublisher, SmartCardRoot, My,
TrustedPeople, AuthRoot, TrustedDevices, Root
Python done
All done
C:\scripts
Notes on the above:
Powershell messes up arguments when running legacy programs. The filter
ensures that all arguments pass through Windows command line processing
unscathed (except they can't contain null characters). You don't actually
have to use the filter if you are careful about how you write quotes in the
code, but it makes life simpler.
Python scripts up to just over 32,000 characters can be written on the
command line this way. You can also assign the script to a variable and
keep the Python command a bit cleaner:
$script = @
print(Python here!)
@
python -c $script
Or without the filter it is best to avoid the double quotes:
$script = @
print('Python here!')
@
c:\python33\python.exe -c $script
To run from a traditional cmd.exe prompt you have to explicitly use
Powershell. The default file associations for .ps1 files will run notepad
instead.
If your system execution policy is Restricted (the default) use:
powershell -executionpolicy RemoteSigned .\Pythoncerts.ps1
Otherwise set the execution policy to something more lenient (at a
Powershell prompt running as administrator enter Set-ExecutionPolicy
RemoteSigned) and you can just do:
powershell .\Pythoncerts.ps1
I also use Powershell interactively so I have the filters defined in my
startup ($Home\Documents\WindowsPowerShell\profile.ps1):
filter py() { $_ | py.exe ($args -replace'(\\*)','$1$1\') }
filter python() { $_ | c:\Python33\python.exe ($args
-replace'(\\*)','$1$1\') }
--
Duncan Booth
--
https://mail.python.org/mailman/listinfo/python-list