Allow logfile parameter to be set to optional for Application object.

Also fix a minor issue with traffic generator experiment imports
not consistently working by relocating to NLSR subdirectory.

Change-Id: Iad04ee0e3bb64a89133f45721c5d2c1e4c468dbf
diff --git a/examples/traffic_generator.py b/examples/nlsr/traffic_generator.py
similarity index 98%
rename from examples/traffic_generator.py
rename to examples/nlsr/traffic_generator.py
index d67e7e2..5b5620c 100644
--- a/examples/traffic_generator.py
+++ b/examples/nlsr/traffic_generator.py
@@ -39,7 +39,7 @@
 from minindn.apps.nfd import Nfd
 from minindn.apps.nlsr import Nlsr
 from minindn.util import copyExistentFile
-from examples.nlsr.nlsr_common import getParser
+from nlsr_common import getParser
 
 def trafficServer(node, serverConfFile):
     """
diff --git a/minindn/apps/application.py b/minindn/apps/application.py
index d7b0b87..aca153d 100644
--- a/minindn/apps/application.py
+++ b/minindn/apps/application.py
@@ -22,6 +22,7 @@
 # If not, see <http://www.gnu.org/licenses/>.
 
 from minindn.util import getPopen
+from typing import Union, Optional
 
 class Application(object):
     def __init__(self, node):
@@ -34,11 +35,14 @@
         self.logDir = '{}/log'.format(self.homeDir)
         self.node.cmd('mkdir -p {}'.format(self.logDir))
 
-    def start(self, command, logfile, envDict=None):
+    def start(self, command: Union[str, list], logfile: Optional[str]=None, envDict: Optional[dict]=None) -> None:
         if self.process is None:
-            self.logfile = open('{}/{}'.format(self.logDir, logfile), 'w')
             if isinstance(command, str):
                 command = command.split()
+            if not logfile:
+                self.process = getPopen(self.node, command, envDict)
+                return
+            self.logfile = open('{}/{}'.format(self.logDir, logfile), 'w')
             self.process = getPopen(self.node, command, envDict,
                                     stdout=self.logfile, stderr=self.logfile)