[英]How to run `ls` command with 'subprocess.check_call' containing a placeholder?
[英]Run Oracle DBCA with subprocess.check_call in python 3
我想運行 Oracle DBCA 在靜默模式下創建數據庫。 我想通過 Python 腳本運行的命令如下:
dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbName testdb -sid testdb -createAsContainerDatabase false -emConfiguration NONE -datafileDestination /u01/data/oracle/testdb/db_files -storageType FS -characterSet AL32UTF8 -totalMemory 2048 -recoveryAreaDestination /u01/app/oracle/fast_recovery_area
如果我直接從 bash 控制台運行該命令,它將完美運行。 現在我想調整它以從 python 腳本運行,所以我做了以下事情:
subprocess.check_call(['dbca', '-silent', '-createDatabase', '-templateName', 'General_Purpose.dbc', '-gdbName', gdbName, '-sid', sid, '-createAsContainerDatabase', 'false', '-emConfiguration', 'NONE', '-datafileDestination', dfDest, '-storageType', storageType, '-characterSet', 'AL32UTF8', '-totalMemory', totalMemory, '-recoveryAreaDestination', recoAreaDest])
並非所有 arguments 都有單引號,這是因為我將一些變量作為 arguments 傳遞。 我的變量如下:
#### VARIABLES ####
gdbName = ""
sid = ""
#dfDest = ""
storageType = "FS"
totalMemory = "2048"
recoAreaDest = oracle_base + "/fast_recovery_area"
#### USER INPUTS ####
while gdbName == "":
gdbName = input("\n" + "Global DB name: ")
while sid == "":
sid = input("SID: ")
dfDest = "/u01/data/oracle/" + sid + "/db_files"
dfDest = input("Datafile destination [" + dfDest + "]: ")
storageType = input("Storage type [" + storageType + "]: ")
totalMemory = input("Total Memory (in MB) [" + totalMemory + "]: ")
recoAreaDest = input("Fast recover area [" + recoAreaDest + "]: ")
因此,當我運行我的腳本時,會發生以下錯誤:
[oracle@dataguard-test-primary ~]$ ./oracle_silent_install.py
1. Install Software
2. Create Database
Option: 2
Oracle Database Creation script
Please enter the required info...
Global DB name: d
SID: d
Datafile destination [/u01/data/oracle/d/db_files]:
Storage type [FS]:
Total Memory (in MB) [2048]:
Fast recover area [/u01/app/oracle/fast_recovery_area]:
java.lang.NullPointerException
at oracle.install.commons.swing.StandardDialog$ErrorDialogShowTask.call(StandardDialog.java:567)
at oracle.install.commons.swing.StandardDialog$ErrorDialogShowTask.call(StandardDialog.java:516)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
[oracle@dataguard-test-primary ~]$
解決了。
在用戶輸入部分,當嘗試點擊“輸入”來選擇默認值時,變量被替換為值null因為它什么也沒讀,所以我在每個用戶輸入后添加了一個if來驗證用戶是否剛剛點擊輸入然后用默認值再次填充變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.